Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Bonjour,
J'ai un back-office codé en PB, avec une base de données DB2.
A chaque fois qu'on veut insérer une ligne en base, dans le code de notre logiciel en PB :
- on déclare une variable
- on appelle une procédure stockée, qui nous génère / réserve un identifiant.
- on stocke le résultat de la procédure dans la variable
- on fait un setitem avec la variable dans la datawindow
- on update la datawindow
A côté de ça, j'ai un Web Service, codé en .NET, qui utilise la même base de données.
Il insère des lignes dans des tables qui sont propres au Web Service.
Un trigger vient alimenter les tables du back-office (pour que les données soient visibles dans le back-office).
Seulement, mon WS ne passe pas par la procédure stockée pour générer l'identifiant en création de ligne.
Et hier soir, le WS et le back-office se sont téléscopés.
Ils ont tous deux voulu insérer une ligne avec le même identifiant (le WS n'étant pas passé par la procédure stockée pour réserver l'identifiant).
Erreur côté back-office "clé primaire déjà utilisée", traitement planté.
Je cherche donc à modifier mon trigger, en appelant la même procédure stockée que côté back-office, pour ne plus que le WS et le back-office se marchent dessus.
Je n'arrive pas à récupérer le résultat de la procédure stockée, et à le donner dans l'insertion pour le trigger.
J'ai cherché sur le Net, je ne trouve pas la syntaxe.
J'ai fait plusieurs essais, non concluants...
KO :
CREATE TRIGGER Create_truc_machin AFTER INSERT ON table_ws REFERENCING NEW AS post FOR EACH ROW BEGIN ATOMIC INSERT INTO table_backoff ( colonne1, colonne2, colonne_id, colonne4, ... ) VALUES ( post.ws_colonne1, post.ws_colonne2, call proc_ide('table_backoff'), post.ws_colonne4, ... ); END|
KO aussi :
CREATE TRIGGER Create_truc_machin AFTER INSERT ON table_ws REFERENCING NEW AS post FOR EACH ROW BEGIN ATOMIC INSERT INTO table_backoff ( colonne1, colonne2, colonne_id, colonne4, ... ) VALUES ( post.ws_colonne1, post.ws_colonne2, proc_ide('table_backoff'), post.ws_colonne4, ... ); END|
KO aussi :
CREATE TRIGGER Create_truc_machin AFTER INSERT ON table_ws REFERENCING NEW AS post FOR EACH ROW BEGIN ATOMIC DECLARE var_compteur int; var_compteur = call PROC_IDE('table_backoff'); INSERT INTO table_backoff ( colonne1, colonne2, colonne_id, colonne4, ... ) VALUES ( post.ws_colonne1, post.ws_colonne2, var_compteur, post.ws_colonne4, ... ); END|
KO aussi :
CREATE TRIGGER Create_truc_machin AFTER INSERT ON table_ws REFERENCING NEW AS post FOR EACH ROW BEGIN ATOMIC DECLARE var_compteur int; var_compteur = PROC_IDE('table_backoff'); INSERT INTO table_bo ( colonne1, colonne2, colonne_id, colonne4, ... ) VALUES ( post.ws_colonne1, post.ws_colonne2, var_compteur, post.ws_colonne4, ... ); END|
Si quelqu'un connaît la solution / syntaxe pour appeler des procédures stockées dans des triggers en DB2, je suis preneuse.
Merci d'avance.
Dernière modification par Saria (21-04-2017 09:51:16)
Hors ligne
Bonjour,
Messages d'erreur ?
Quelle version de DB2, car :
CALL in Trigger is a DB2 V8.2 feature
Hors ligne
Au temps pour moi, j'avais oublié de préciser : DB2 V9.
Finalement, j'ai trouvé...
https://www.ibm.com/support/knowledgece … 11377.html
CREATE TRIGGER Create_truc_machin AFTER INSERT ON table_ws REFERENCING NEW AS post FOR EACH ROW BEGIN ATOMIC DECLARE var_compteur INTEGER DEFAULT 0; call PROC_IDE('table_backoff'); GET DIAGNOSTICS var_compteur = RETURN_STATUS; INSERT INTO table_bo ( colonne1, colonne2, colonne_id, colonne4, ... ) VALUES ( post.ws_colonne1, post.ws_colonne2, var_compteur, post.ws_colonne4, ... ); END|
Je vais toper le sujet en Résolu.
Hors ligne