-
 Zitat von Fuerchau
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.
Similar Threads
-
By svit in forum NEWSboard Programmierung
Antworten: 2
Letzter Beitrag: 03-03-16, 11:11
-
By JotSo in forum IBM i Hauptforum
Antworten: 9
Letzter Beitrag: 22-12-15, 12:08
-
By Etherion in forum NEWSboard Programmierung
Antworten: 6
Letzter Beitrag: 30-09-14, 13:36
-
By mk in forum NEWSboard Programmierung
Antworten: 3
Letzter Beitrag: 22-09-14, 06:58
-
By JMH in forum IBM i Hauptforum
Antworten: 7
Letzter Beitrag: 15-01-14, 14:53
Tags for this Thread
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks