J'ai une séquence Oracle définie comme suit:
CREATE SEQUENCE "DALLAS"."X_SEQ"
MINVALUE 0
MAXVALUE 999999999999999999999999999
INCREMENT BY 1 START WITH 0 NOCACHE NOORDER NOCYCLE ;
Il est utilisé dans une procédure stockée pour insérer un enregistrement:
PROCEDURE Insert_Record
(p_name IN VARCHAR2,
p_userid IN INTEGER,
cur_out OUT TYPES_PKG.RefCursor)
IS
v_id NUMBER := 0;
BEGIN
-- Get id value from sequence
SELECT x_seq.nextval
INTO v_id
FROM dual;
-- Line below is X_PKG line 40
INSERT INTO X
(the_id,
name,
update_userid)
VALUES
(v_id,
p_name,
p_userid);
-- Return new id
OPEN cur_out FOR
SELECT v_id the_id
FROM dual;
END;
Parfois, cette procédure renvoie une erreur lorsqu'elle est exécutée à partir du code d'application.
ORA-01400: cannot insert NULL into ("DALLAS"."X"."THE_ID")
ORA-06512: at "DALLAS.X_PKG", line 40
ORA-06512: at line 1
Détails qui peuvent ou non être pertinents:
- Oracle Database 11g Enterprise Edition version 11.2.0.1.0 - Production 64 bits
- La procédure est exécutée via Microsoft.Practices.EnterpriseLibrary - Data.Oracle.OracleDatabase.ExecuteReader (commande DbCommand)
- L'application n'encapsule pas l'appel dans une transaction explicite.
- L'insert échoue par intermittence - moins de 1%
Dans quelles circonstances pourrait x_seq.nextval
être nul?
v_id
n'est référencé que dans la sélection de séquence, l'insertion et le curseur final. Notre prochaine étape a été d'ajouter le code de débogage. Nous devrons peut-être attendre les résultats car cela n'arrive qu'en production et très rarement. Il existe un déclencheur qui s'insère dans une table d'audit. Je l'ai passé au peigne fin sans pistolet fumant. Le problème se produit également occasionnellement dans d'autres tables sans déclencheurs. Merci d'avoir regardé.