![]() |
Insert & Select in einer Stored Proc
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? |
Re: Insert & Select in einer Stored Proc
Hi,
Zitat:
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 |
Re: Insert & Select in einer Stored Proc
Ich verwende IB 6.5. Die SP ist ganz normal auf gebaut.
Delphi-Quellcode:
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.
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; |
Re: Insert & Select in einer Stored Proc
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 |
Re: Insert & Select in einer Stored Proc
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:
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.
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); |
Re: Insert & Select in einer Stored Proc
Hi,
Zitat:
SQL-Code:
Hier suchst DU doch anhand der Mandanten-ID nach vorhandenen Datensätzen, also warum verwendest Du diese nicht direkt für den Insert.
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 Von dem mal abgesehen macht das:
SQL-Code:
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....?!
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); Kannst DU mal die beiden Tabellen posten (Create Tabel), dann kann ich Dir vielleicht ne SP zusammenbasteln... Grüße Lemmy |
Re: Insert & Select in einer Stored Proc
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. |
Re: Insert & Select in einer Stored Proc
Zitat:
SQL-Code:
in der Tabelle rdb$database steht immer genau ein Datensatz drin und wird für solche Dinge eigentlich immer verwendet!
SELECT gen_ID(Generator,1) from rdb$database into iNeueID;
INSERT INTO...... Grüße Lemmy |
Re: Insert & Select in einer Stored Proc
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 |
Re: Insert & Select in einer Stored Proc
Hallo Albi,
fehlt da nicht ein SUSPEND am Ende der SP? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:59 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz