Trigger SQL

RPG (3 et 4, free), CL, SQL, etc...
Répondre
N1kos
Messages : 34
Enregistré le : ven. 08 févr. 2013, 09:41:45

Trigger SQL

Message par N1kos »

Bonjour,

Je souhaite faire un trigger de numérotation dans le cas ou la colonne n'est pas renseignée (cf. ci-dessous) mais ça ne fonctionne pas bien:

Code : Tout sélectionner

CREATE TRIGGER CIQPGMR4.CITSNKTIAA BEFORE INSERT ON CIQPGMR4.CITSNKP1
REFERENCING NEW AS NW FOR EACH ROW WHEN (NW.NOR8 = 0 OR NW.NOR8 IS NULL) SET NW.NOR8 = (SELECT MAX((IFNULL(NKP.NOR8, 0))+1) FROM CIQPGMR4.CITSNKP1 NKP WHERE NKP.CSOC = NW.CSOC ) ;
Le problème semble provenir de la requête de récupération "SELECT MAX((IFNULL(NKP.NOR8, 0))+1) ..."

Merci d'avance de votre retour si vous avez la solution à mon problème
N1kos

vazymimil
Messages : 17
Enregistré le : ven. 28 sept. 2018, 17:14:46

Re: Trigger SQL

Message par vazymimil »

Bonjour,

un peu plus de détail sur l'erreur ce serait pas de refus :lol:
mais cette requête ne peut pas fonctionner s'il n'y a pas d'enregistrement dans CITSNKP1 WHERE NKP.CSOC = NW.CSOC, dans ces cas le select retourne NULL malgré l'IFNULL parceque ce dernier n'est pas exécuté ... parce-qu'aucun enregistrement n'est sélectionné

ça marcherai mieux comme ça
= IFNULL(SELECT MAX(NKP.NOR8, 0) FROM CIQPGMR4.CITSNKP1 NKP), 0) + 1
Nicolas

N1kos
Messages : 34
Enregistré le : ven. 08 févr. 2013, 09:41:45

(sujet inconnu)

Message par N1kos »

Bonjour,

Merci de votre retour, effet j'ai fait la modification sur la requete SQL, ci-dessous plus d'information sur le message d'erreur lorsque je souhaite executer le script de création du trigger:

Code fournisseur : -628
Message : [SQL0628] Clauses incorrectes dans la même définition. Cause . . . . . : Les clauses indiquées pour définir les attributs d'une colonne, d'une fonction dérivée, d'une procédure, d'un déclencheur ou d'un index ne sont pas admises. L'une des erreurs suivantes s'est produite : - Plusieurs clauses FOR BIT DATA, FOR SBCS DATA, FOR MIXED DATA ou CCSID ont été indiquées pour une définition de colonne. - READ PERMISSION FS et WRITE PERMISSION BLOCKED ont été indiqués pour une colonne de type DATALINK. - READ PERMISSION DB et WRITE PERMISSION FS ont été indiqués pour une colonne de type DATALINK. - WRITE PERMISSION FS et la clause ON UNLINK ont été indiqués pour une colonne de type DATALINK. - INCLUDING ou EXCLUDING COLUMN DEFAULTS et USING TYPE DEFAULTS ont été indiqués pour une table. - Une clause a été indiquée alors qu'elle n'est pas admise lors de la création d'une fonction dérivée. -- Une clause RETURNS a été indiquée pour ALTER FUNCTION, mais la modification n'a pas indiqué REPLACE. -- AUTONOMOUS est spécifié pour une procédure et COMMIT ON RETURN ou DYNAMIC RESULT SETS avec une valeur autre que zéro est également spécifié. -- WITH RETURN est spécifié pour un curseur dans une instruction composée (dynamique). -- FOR EACH STATEMENT est indiqué pour un déclencheur BEFORE ou INSTEAD, ou est précisé avec MODE DB2ROW. - MODE DB2SQL est indiqué pour un déclencheur BEFORE et celui-ci contient une référence à une table de déclenchement. -- Une clause WHEN ou une liste de colonnes UPDATE est associée à un déclencheur INSTEAD OF. - Un nom de corrélation avec OLD ROW ou NEW ROW et un SET OPTION pour les options de date et d'heure ont été indiqués. -- Pour CREATE INDEX, la clause RCDFMT ne peut pas être indiquée si la clause INCLUDE est précisée. La clause INCLUDE requiert la clause ENCODED VECTOR. -- L'option définie dans SET OPTION DBGVIEW n'est pas cohérente par rapport à la valeur attribuée au mode débogage. -- L'option SET OPTION CONACC ne peut pas être indiquée avec l'option de routine CONCURRENT ACCESS RESOLUTION. -- L'option SET OPTION SYSTIME ne peut pas être indiquée avec l'option de routine SYSTEM_TIME SENSITIVE. Que faire . . . : Modifiez ou supprimez une clause pour que la définition soit admise. Renouvelez votre demande.
N1kos

vazymimil
Messages : 17
Enregistré le : ven. 28 sept. 2018, 17:14:46

Re: (sujet inconnu)

Message par vazymimil »

Je pense que le problème soit là:
MODE DB2SQL est indiqué pour un déclencheur BEFORE et celui-ci contient une référence à une table de déclenchement.

En anglais ce serait plûtot la table de déclenchement
MODE DB2SQL is specified for a BEFORE trigger and the trigger contains a reference to the trigger table.

Je crois qu'il va falloir trouver un autre moyen de calculer l'incrément
Nicolas

N1kos
Messages : 34
Enregistré le : ven. 08 févr. 2013, 09:41:45

(sujet inconnu)

Message par N1kos »

Merci pour le retour il est toujours possible de faire l'incrément via un trigger AFTER mais c'est pas clean du tout.

En plus la syntaxe SELECT macle FROM MATABLE (INSERT INTO ...) ne fonctionne pas avec un un trigger after.

C'est dommage si il n'y pas de solution car il me semble qu'en Mariadb (MySql) ça fonctionne avec un trigger Before
N1kos

cmasse
Site Admin
Messages : 764
Enregistré le : mer. 14 févr. 2007, 18:00:03
Localisation : Nantes
Contact :

MODE DB2ROW

Message par cmasse »

Comme indiqué c'est le mode DB2SQL qui pose problème.

remplacez FOR EACH ROW par FOR EACH ROW MODE DB2ROW et ça doit le faire (testé chez moi, ça marche)
Christian Massé (Volubis.fr)

N1kos
Messages : 34
Enregistré le : ven. 08 févr. 2013, 09:41:45

(sujet inconnu)

Message par N1kos »

Bonjour,

Grace à un collègue nous avons trouvé l'erreur, vous trouverez ci-dessous une syntaxe qui fonctionne:

Code : Tout sélectionner

CREATE TRIGGER CIQPGMR4.CITSNKTIAA BEFORE INSERT ON CIQPGMR4.CITSNKP1 REFERENCING NEW ROW AS N FOR EACH ROW MODE DB2ROW SECURED WHEN(N.NOR8 = 0 OR N.NOR8 IS NULL) BEGIN SET N.NOR8 = IFNULL((SELECT MAX((IFNULL(NKP.NOR8, 0))) FROM CIQPGMR4.CITSNKP1 NKP WHERE NKP.CSOC = N.CSOC ), 0) + 1 ; END 
Merci de votre aide
N1kos

Répondre