Eu tenho uma sequência Oracle definida assim:
CREATE SEQUENCE "DALLAS"."X_SEQ"
MINVALUE 0
MAXVALUE 999999999999999999999999999
INCREMENT BY 1 START WITH 0 NOCACHE NOORDER NOCYCLE ;
É usado em um procedimento armazenado para inserir um 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, esse procedimento retorna um erro quando executado a partir do código do aplicativo.
ORA-01400: cannot insert NULL into ("DALLAS"."X"."THE_ID")
ORA-06512: at "DALLAS.X_PKG", line 40
ORA-06512: at line 1
Detalhes que podem ou não ser relevantes:
- Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Produção de 64 bits
- O procedimento é executado via Microsoft.Practices.EnterpriseLibrary - Data.Oracle.OracleDatabase.ExecuteReader (comando DbCommand)
- O aplicativo não quebra a chamada em uma transação explícita.
- A inserção falha intermitentemente - menos de 1%
Em que circunstâncias poderia x_seq.nextval
ser nulo?
v_id
é referenciado apenas na seleção de sequência, na inserção e no cursor final. Nosso próximo passo foi adicionar o código de depuração. Podemos ter que esperar pelos resultados, pois isso só acontece na produção e com pouca frequência. Há um gatilho que é inserido em uma tabela de auditoria. Eu penteei com ele sem arma de fumar. O problema também ocorre ocasionalmente em outras tabelas sem gatilhos. Obrigado por dar uma olhada.