Tengo una secuencia de Oracle definida así:
CREATE SEQUENCE "DALLAS"."X_SEQ"
MINVALUE 0
MAXVALUE 999999999999999999999999999
INCREMENT BY 1 START WITH 0 NOCACHE NOORDER NOCYCLE ;
Se utiliza en un procedimiento almacenado para insertar un registro:
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;
Ocasionalmente, este procedimiento devuelve un error cuando se ejecuta desde el código de la aplicación.
ORA-01400: cannot insert NULL into ("DALLAS"."X"."THE_ID")
ORA-06512: at "DALLAS.X_PKG", line 40
ORA-06512: at line 1
Detalles que pueden o no ser relevantes:
- Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Producción de 64 bits
- El procedimiento se ejecuta a través de Microsoft.Practices.EnterpriseLibrary - Data.Oracle.OracleDatabase.ExecuteReader (comando DbCommand)
- La aplicación no ajusta la llamada en una transacción explícita.
- El inserto falla intermitentemente - menos del 1%
¿En qué circunstancias podría x_seq.nextval
ser nulo?
v_id
solo se hace referencia en la selección de secuencia, la inserción y el cursor final. Nuestro siguiente paso fue agregar el código de depuración. Es posible que tengamos que esperar los resultados, ya que solo ocurre en la producción y con muy poca frecuencia. Hay un disparador que se inserta en una tabla de auditoría. Lo he peinado sin una pistola humeante. El problema también ocurre ocasionalmente en otras tablas sin desencadenantes. Gracias por echar un vistazo.