Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL Variable (https://www.delphipraxis.net/12676-sql-variable.html)

Hansa 2. Dez 2003 10:33


SQL Variable
 
Hi,

wie definiere ich in SQL eine Variable ? Vielleicht gehts aber auch anders, ich will einen aus einem Trigger erhaltenen Wert an einen anderen Trigger oder SP übergeben.

r_kerber 2. Dez 2003 10:45

Re: SQL Variable
 
Hallo Hansa,

nur mal ein beispiel, wie wir das in Informix machen:
SQL-Code:
create procedure pi_rvv(new_rvv_kumul INTEGER,
                        new_rvv_zuord_datu INTEGER,
                        new_rvv_art INTEGER)
    define errno      integer;
    define errmsg     char(255);
    define numrows    integer;
...

-- Insert trigger "ti_rvv" for table "rvv"
create trigger ti_rvv insert on rvv
referencing new as new_ins
   for each row (execute procedure pi_rvv(new_ins.rvv_kumul,
                                          new_ins.rvv_zuord_datum_id,
                                          new_ins.rvv_art));
Ich werde mal versuchen, ob PowerDesigner mir auch etwas vernünftiges für Interbase auswirft.

r_kerber 2. Dez 2003 10:54

Re: SQL Variable
 
Für Interbase 6 kommt so'n Mischmasch aus Trigger und Stored procedure heraus:
SQL-Code:
set term /;
create trigger ti_rvv for tabelle1
before insert as
declare variable numrows integer;
begin
    /*  Parent "tabelle2" must exist when inserting a child in "tabelle1" */
    if (new.spalte is not null) then
    begin
       select count(*)
       from  tabelle2
       where tabelle2.spalte= new.spalte
       into  :numrows;
       
       if (numrows = 0) then
       begin
          exception sdp_icpe;
       end
    end
...
end
end;/
set term ;/

Hansa 2. Dez 2003 11:16

Re: SQL Variable
 
Habe das ganze etwas einfacher gemacht:

SQL-Code:
CREATE TRIGGER ART_BU0 FOR ART
ACTIVE BEFORE UPDATE POSITION 0
AS
  DECLARE VARIABLE ANR INTEGER;
BEGIN
  SELECT ID FROM ART INTO :ANR;   /* Trigger text */
end
Fehler kommt keiner, aber die Variable gilt offensichtlich nur in dem Trigger. Ich brauche den Wert aber noch woanders.

r_kerber 2. Dez 2003 11:21

Re: SQL Variable
 
Hallo Hansa,

Mein Beispiel ist ein Insert-Trigger im Rahmen von RI-Vorgaben. Wo und wofür brauchst Du die Variable? In einem Delphi-Programm? In einer andern SP?

Hansa 2. Dez 2003 11:32

Re: SQL Variable
 
Habe mich kurzerhand entschlossen, doch eine SP zu verwenden 8)

SQL-Code:
ALTER PROCEDURE TEST_PROCEDURE
RETURNS (
    ANR INTEGER)
AS
BEGIN
 SELECT ID FROM ART INTO :ANR;
 SUSPEND;
END
Jetzt bin ich aber wieder fast am Anfang: wie kann ich das jetzt weiterverarbeiten ? Den Wert von ANR bräuchte ich in einem INSERT als value. Ich kann ja nicht schreiben :

SQL-Code:
INSERT INTO TABLE2 (ID_FREMD,FELD1) VALUES (SELECT ANR FROM TEST_PROCEDURE,NEW.FELD1);

r_kerber 2. Dez 2003 11:40

Re: SQL Variable
 
Warum nicht? in der OH von Interbase steht:
SQL-Code:
INSERT [TRANSACTION transaction] INTO <object> [(col [, col …])]
   {VALUES (<val> [, <val> …]) | <select_expr>};

<object> = tablename | viewname

<val> = {:variable | <constant> | <expr>
   | <function> | udf ([<val> [, <val> …]])
   | NULL | USER | RDB$DB_KEY | ? 

} [COLLATE collation]
...
expr   A valid SQL expression that results in a single column value

Hansa 2. Dez 2003 20:54

Re: SQL Variable
 
Habe jetzt folgenden BI-Trigger:

SQL-Code:
AS
DECLARE VARIABLE ARTNR INTEGER;
begin
  SELECT ANR FROM TEST_PROCEDURE INTO :ARTNR;
  post_event ('ÖÄÖÄÖÄ'); /* INTO :ARTNR; */
  INSERT INTO LAGER (ID_ART,BESTAND) VALUES (:ARTNR,NEW.BESTAND);
end
Und diese SP hier:

SQL-Code:
BEGIN
  SELECT ID FROM ART8 INTO :ANR;  
 SUSPEND;
END
jetzt kommt : "multiple rows in singleton select". Was sagt uns das ?Ist der Ansatz überhaupt sinnvoll ? Das Select einfach so als value zu verwenden hat zumindest auf Anhieb nicht funktioniert, deshalb dieser "Umweg". Und noch kurze zwischenfrage : was ist mit dem Post_Event ? Wollte mal sehen, ob da überhaupt was passiert, aber davon seh ich nichts. 8)


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:32 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