Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Insert & Select in einer Stored Proc (https://www.delphipraxis.net/22073-insert-select-einer-stored-proc.html)

Albi 12. Mai 2004 07:43


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?

Lemmy 12. Mai 2004 11:16

Re: Insert & Select in einer Stored Proc
 
Hi,

Zitat:

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

Albi 12. Mai 2004 11:35

Re: Insert & Select in einer Stored Proc
 
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.

Lemmy 12. Mai 2004 11:52

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

Albi 12. Mai 2004 12:09

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:
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.

Lemmy 12. Mai 2004 12:22

Re: Insert & Select in einer Stored Proc
 
Hi,

Zitat:

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

Albi 12. Mai 2004 12:54

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.

Lemmy 12. Mai 2004 12:59

Re: Insert & Select in einer Stored Proc
 
Zitat:

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

Albi 12. Mai 2004 13:43

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

MrSpock 12. Mai 2004 13:49

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 22:22 Uhr.
Seite 1 von 2  1 2      

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