Zitat Zitat von Fuerchau Beitrag anzeigen
Das Problem ist halt manchmal der Autocast.
Wenn die Feldtypen nicht stimmen, versucht SQL eine Typanpassung.
...
Die Frage ist hier: Wie rufst du die Prozedur denn auf "select * from MyProc(?, ?, ...)"?
Über SQL Prozedur ausführen im Nachgang an die Erstellungsroutine der SQL Prozedur habe ich eine "Test"-Rubrik wo ich im o.g. Fall z.B. 2 x mal den gleichen Command absetze:
Code:
call hgwobj.vag13_insert(5, 23, 22.233, 'WRKSTN', 'SQL', 'SQL Prozedur ausführen');
call hgwobj.vag13_insert(5, 23, 22.233, 'WRKSTN', 'SQL', 'SQL Prozedur ausführen');
Der erste klappt, der zweite nicht.

Wenn ich das FINAL Table in der SQL-Prozedur weglasse u. stattdessen "old-school" über IDENTITY_VAL_LOCAL() arbeite um mir die ID des Inserts zu holen und im Anschluss den Cursor über den/die Sätze zurückgebe klappt es ja ohne Probleme!

Hier der geänderte Teil der SQL Prozedur:
Code:
BEGIN


DECLARE pId INTEGER DEFAULT 0;
DECLARE C1 CURSOR WITH RETURN TO CALLER FOR 
SELECT * FROM vVag13P01 where id = pId;


 INSERT INTO vVag13P01
 (
  RabattId, Menge, RabattWert
  ,WRKSTNNAME,  CLIENTPROGRAMID, CLIENTAPPLNAME
 )
 VALUES
 (
  pRabattId, pMenge, pRabattWert
  ,pWRKSTNNAME, pCLIENTPROGRAMID, pCLIENTAPPLNAME
 );


SET pId = IDENTITY_VAL_LOCAL();


IF (pId > 0 ) THEN
-- Cursor öffnen u. zurückgeben
 OPEN C1;
 SET RESULT SETS WITH RETURN TO CALLER CURSOR C1;
END IF; 


END;
Auch wenn ich es in einem BEGIN/END-Block zusammenfasse um saubere Variablen vom gleichen Typ zu haben, kommt der gleiche Fehler:
Code:
BEGIN
DECLARE pRabattId INTEGER;
DECLARE pMenge  decimal(11,3);
DECLARE pRabattWert decimal (5,2);
-- Systemfelder
DECLARE pWRKSTNNAME  VARCHAR(50);
DECLARE pCLIENTPROGRAM VARCHAR(50);
DECLARE pCLIENTAPPLNAME VARCHAR(50);
SET pRabattId   = 5;
SET pMenge   = 00000001.000;
SET pRabattWert  = 000.33;
SET pWRKSTNNAME  = 'WRKSTN';
SET pCLIENTPROGRAM  = 'CPGMID';
SET pCLIENTAPPLNAME  = 'APPLNAME';

-- call hgwobj.vag13_insert(5, 1, 2, 'WRKSTN', 'SQL', 'SQL Prozedur ausführen');

call hgwobj.vag13_insert(pRabattId, pMenge, pRabattWert, pWRKSTNNAME, pCLIENTPROGRAM, pCLIENTAPPLNAME);

SET pMenge   = 00000002.200;
SET pRabattWert  = 001.33;
call hgwobj.vag13_insert(pRabattId, pMenge, pRabattWert, pWRKSTNNAME, pCLIENTPROGRAM, pCLIENTAPPLNAME);


rollback;
END;
Fazit für mich ist erstmal, dass ich das FINAL Table hier lieber sein lasse u. mir den Cursor selbst basierend auf der generierten ID zurückliefern lasse. Das ist vermutlich auch für Tabellen ohne Autoinkrementspalte der einzige Weg, die Änderungen der Datenbank abzufragen.