AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Insert & Select in einer Stored Proc
Thema durchsuchen
Ansicht
Themen-Optionen

Insert & Select in einer Stored Proc

Ein Thema von Albi · begonnen am 12. Mai 2004 · letzter Beitrag vom 12. Mai 2004
Antwort Antwort
Seite 1 von 2  1 2      
Albi

Registriert seit: 4. Mai 2003
Ort: Berlin
458 Beiträge
 
Delphi 7 Professional
 
#1

Insert & Select in einer Stored Proc

  Alt 12. Mai 2004, 08:43
Hallo,

ich habe ein kleines Problem mit einer Stored Proc. Diese Proc überprüft ob Kunde schon vorhanden ist. Wenn ja, nur updaten ansonsten erstellen. Soweit geht es auch super nun aber will ich die ID eines neu erstellten Kunden in eine 2 DB schreiben (1 zu n). Ich bekomme diesen Wert aber nicht ausgelesen da auf der DB noch kein Commit ausgelöst wurde. Wenn ich versuche nach Insert ein Commit zu setzen bekomme ich die Meldung, das es sich um reserviertes Wort handelt.

Wie also kann solch einen Wert auslesen?
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.381 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Insert & Select in einer Stored Proc

  Alt 12. Mai 2004, 12:16
Hi,

Zitat von Albi:
Soweit geht es auch super nun aber will ich die ID eines neu erstellten Kunden in eine 2 DB schreiben (1 zu n).

es ist IMHO nicht möglich mittels einer SP auf eine andere Datenbank zuzugreifen... WElches DBMS verwendest Du? WIe sieht die SP aus?

Grüße
Lemmy
  Mit Zitat antworten Zitat
Albi

Registriert seit: 4. Mai 2003
Ort: Berlin
458 Beiträge
 
Delphi 7 Professional
 
#3

Re: Insert & Select in einer Stored Proc

  Alt 12. Mai 2004, 12:35
Ich verwende IB 6.5. Die SP ist ganz normal auf gebaut.

Delphi-Quellcode:
Create Procedure Test1(
Input Variable)
Returns(
Output Variablen))
as
Declare Variable iCount integer;
Begin
For
  Select Count( * ) From DB WHERE ID = :sID
  Into: iCount
Do

If iCount = 0 Then
Begin
  Insert
end
else
  UpDate

//Hier müßte ich ein Commit setzen, das die Daten in die DB geschrieben werden. Um Sie dann wieder auslesen zukönnen.

Select ID From DB Where ....
into: MID;
Ich hoffe es halbwegs verständlich, was ich meine. Oder kann man diese Information aus einer Systemtabelle beziehen? IB muß die Daten bis zum Commit oder Rollback doch irgendwo zwischen speichern.
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.381 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Insert & Select in einer Stored Proc

  Alt 12. Mai 2004, 12:52
Hi Alibi,

nochmal: Willst Du dass die SP innerhalb einer Datenbank in eine andere Tabelle schreibt, oder sollen die Daten in eine ander Datenbank wandern????

Eine SP läuft immer innerhalb einer Transaktion ab, d.h. alle Änderungen die die SP macht sind sofort sichtbar (für die SP). Deshalb ist auch kein COMMIT nochwendig (übrigends ist das gar nicht erlaubt / vorgesehen).

Von der Struktur her ist Deine Sp in Ordnung, sie sollte eigentlich funktionieren. Wenn Du diesen Wert nicht ausgelesen bekommst, was passiert dann? Fehlermeldung, Rückgabewert, usw...

Grüße
Lemmy
  Mit Zitat antworten Zitat
Albi

Registriert seit: 4. Mai 2003
Ort: Berlin
458 Beiträge
 
Delphi 7 Professional
 
#5

Re: Insert & Select in einer Stored Proc

  Alt 12. Mai 2004, 13:09
Die ID des Mandanten soll einfach nur beim speichern in die andere Tabelle (gleiche DB) geschrieben werden.

Ich habe um das Ergebnis zu bekommen mir gedacht, ich selecte nach den 2 variablen, die von Client kommen, sprich Name und Vorname. Aber die sind ja noch nicht in die DB geschrieben. Somit sind sie über select nicht nicht auffindbar. Und da liegt der Hund begraben.

Es muß doch möglich sein, das in einer SP auszuführen.

Delphi-Quellcode:
Select Count( * ) From DBDMand WHERE Name = :sName AND Vorname = :sVorname OR Firma = :sFirma
into :iMID,
 
If iMID = 0 Then
Insert Into DBDMand (AID, MID) Values (:AID, :iMID);
Aber das funzt nicht. Wenn der Mandant noch nicht vorhanden ist Schreib die Proc in die Tabelle alle ID's rein, die in der HauptDB sind und das ist nicht meine Absicht. Wenn der Mandant vorhanden ist funzt es.
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.381 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: Insert & Select in einer Stored Proc

  Alt 12. Mai 2004, 13:22
Hi,

Zitat von Albi:

Delphi-Quellcode:
Select Count( * ) From DBDMand WHERE Name = :sName AND Vorname = :sVorname OR Firma = :sFirma
into :iMID,
 
If iMID = 0 Then
Insert Into DBDMand (AID, MID) Values (:AID, :iMID);
das hier macht absolut keinen Sinn! Wenn Du einmal zwei Mandanten hast, die identische Vor und Nachnamen haben bist Du aufgeschmissen... Deshalb gibts so ne Erfindung die sich PrimaryKey nennt und die Du auch einsetzt. Warum suchst Du denn den Mandanten nochmals raus, wenn Du eh schon die ID hast?

SQL-Code:
Create Procedure Test1(
Input Variable)
Returns(
Output Variablen))
as
Declare Variable iCount integer;
Begin
For
  Select Count( * ) From DB WHERE ID = :sID
  Into: iCount
Do
Hier suchst DU doch anhand der Mandanten-ID nach vorhandenen Datensätzen, also warum verwendest Du diese nicht direkt für den Insert.

Von dem mal abgesehen macht das:

SQL-Code:
Select Count( * ) From DBDMand WHERE Name = :sName AND Vorname = :sVorname OR Firma = :sFirma
into :iMID,

If iMID = 0 Then
Insert Into DBDMand (AID, MID) Values (:AID, :iMID);
keinen Sinn! Wenn iMID=0 dann wird ein Eintrag in die Tabelle DBDMand gemacht und als Wert für iMID 0 eingetragen. Ist das so gewollt?? Ich dachte dass iMid der PrimaryKey sein soll....?!


Kannst DU mal die beiden Tabellen posten (Create Tabel), dann kann ich Dir vielleicht ne SP zusammenbasteln...

Grüße
Lemmy
  Mit Zitat antworten Zitat
Albi

Registriert seit: 4. Mai 2003
Ort: Berlin
458 Beiträge
 
Delphi 7 Professional
 
#7

Re: Insert & Select in einer Stored Proc

  Alt 12. Mai 2004, 13:54
War mein Fehler. Das Count muß natürlich weg.Ansonsten macht es wirklich keinen Sinn.

Das ist schon richtig, das ich die ID's vergleiche in der ersten Abfrage. Hier entscheidet sich nun ob insert oder update gewählt wird. Und das läuft doch auch so wie es soll.

Wenn der Datensatz updated ist auch alles super, dann kann man auch das über die ID machen da mir diese ja auch bekannt ist. Aber wenn es ein neuer Datensatz ist, weiß ich die ID ja nicht, da sie vom Client-Prog nicht übermittelt (ID = 0 wird übermittelt), sondern von der DB erzeugt wird.
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.381 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: Insert & Select in einer Stored Proc

  Alt 12. Mai 2004, 13:59
Zitat von Albi:
Wenn der Datensatz updated ist auch alles super, dann kann man auch das über die ID machen da mir diese ja auch bekannt ist. Aber wenn es ein neuer Datensatz ist, weiß ich die ID ja nicht, da sie vom Client-Prog nicht übermittelt (ID = 0 wird übermittelt), sondern von der DB erzeugt wird.
auch dann ist es kein Problem, denn bei einem Insert wird die ID ja sicherlich von einem Generator erzeugt. Also vor das Insert einfach ein

SQL-Code:
 SELECT gen_ID(Generator,1) from rdb$database into iNeueID;
INSERT INTO......
in der Tabelle rdb$database steht immer genau ein Datensatz drin und wird für solche Dinge eigentlich immer verwendet!

Grüße
Lemmy
  Mit Zitat antworten Zitat
Albi

Registriert seit: 4. Mai 2003
Ort: Berlin
458 Beiträge
 
Delphi 7 Professional
 
#9

Re: Insert & Select in einer Stored Proc

  Alt 12. Mai 2004, 14:43
Ich habe das jetzt mal ausprobiert, wenn ich das ganze in dem SQL Editor ausprobiere bekomme ich einen Wert zurück, wenn ich jedoch das ganze in meiner SP ablaufen lasse, bekomme ich den Wert NULL zurück.

Hier ist mal das wichtige der SP, vielleicht liegt der Fehler ja ganz wo anders.

Delphi-Quellcode:
CREATE PROCEDURE PROCINSERTMAND (
    SID INTEGER,
    SAID INTEGER,
    SANREDEID INTEGER,
    SVORNAME VARCHAR (20),
    SNAME VARCHAR (20))
RETURNS (
    FMID INTEGER)
AS
declare variable iCount Integer;
declare variable NewMID integer;
BEGIN

for
  Select Count( * ) From DBMandanten WHERE ID = :sID
  into :iCount
Do

if (iCount = 1) then
Begin
  UPDATE DBMANDANTEN
  SET
    ANREDEID = :sANREDEID,
    VORNAME = :sVORNAME,
    NAME = :sNAME,
    
  WHERE
    (ID = :sID);

end
else
begin
  
  Insert Into dbmandanten (ANREDEID, VORNAME, NAME)
    
  Values (:sANREDEID, :sVORNAME, :sNAME);
end

Select gen_id(dbmandanten_id_gen,0) From RDB$Database
into :fMID;

Insert Into dbdmand (AID, MID) Values (:sAID, :fMID);
END
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#10

Re: Insert & Select in einer Stored Proc

  Alt 12. Mai 2004, 14:49
Hallo Albi,

fehlt da nicht ein SUSPEND am Ende der SP?
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:35 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz