Ich habe eine gespeicherte Prozedur, die Einfügungen und Aktualisierungen in den Tabellen ausführt. Die Notwendigkeit, es zu erstellen, war zu versuchen, alle Scanfunktionen vor dem Einfügen oder Aktualisieren von Datensätzen zu zentralisieren. Heute ergab sich die Notwendigkeit, den Wert des Feldes ID
der Tabelle zurückzugeben, damit meine Anwendung die Registrierung finden und andere gespeicherte Prozeduren ausführen kann.Wie gibt man Werte vom dynamisch generierten Befehl "insert" zurück?
Stored Procedure
SET TERM^;
CREATE OR ALTER procedure sp_insupd (
iaction varchar(3),
iusuario varchar(20),
iip varchar(15),
imodulo varchar(30),
ifieldsvalues varchar(2000),
iwhere varchar(1000),
idesclogs varchar(200))
returns (
oid integer)
as
declare variable vdesc varchar(10000);
begin
if (iaction = 'ins') then
begin
vdesc = idesclogs;
/*** the error is on the line below ***/
execute statement 'insert into '||:imodulo||' '||:ifieldsvalues||' returning ID into '||:oid||';';
end else
if (iaction = 'upd') then
begin
execute statement 'select '||:idesclogs||' from '||:imodulo||' where '||:iwhere into :vdesc;
execute statement 'execute procedure SP_CREATE_AUDIT('''||:imodulo||''');';
execute statement 'update '||:imodulo||' set '||:ifieldsvalues||' where '||:iwhere||';';
end
insert into LOGS(USUARIO, IP, MODULO, TIPO, DESCRICAO) values (
:iusuario, :iip, :imodulo, (case :iaction when 'ins' then 1 when 'upd' then 2 end), :vdesc);
end^
SET TERM ;^
Der Fehler in der obigen Zeile auftritt aufgrund Syntaxfehler. Die Prozedur wird normal kompiliert, dh der Fehler tritt bei der Kompilierung nicht auf, da die betreffende Zeile über die "Anweisung ausführen" ausgeführt wird. Wenn es nicht erforderlich, den Wert des ID
Feld zurückzukehren war, arbeitete das Verfahren normalerweise mit der Zeile wie folgt aus:
...
execute statement 'insert into '||:imodulo||' '||:ifieldsvalues||';';
...
Was der richtige Weg wäre für den Wert des ID
Feld in der OID
gespeichert werden Variable?
ich die Änderungen mach deine Antwort nach. Ich werde das Ergebnis bald veröffentlichen. Vielen Dank! –
@CarlosAndrade naja, schätze ich lag falsch. Sie müssen nur exec-stmt-in verwenden. exec-block ist schwieriger mit string variable/expression als stmt-Quelle zu kombinieren. Um die Rückgabewerte von EB zu erhalten, müssten Sie außerdem die FOR EXECUTE BLOCK-Schleife ausführen. Welches ist viel mehr Boilerplate –
Okay, ich versuche all diese Möglichkeiten. –