Ho una sequenza Oracle definita in questo modo:
CREATE SEQUENCE "DALLAS"."X_SEQ"
MINVALUE 0
MAXVALUE 999999999999999999999999999
INCREMENT BY 1 START WITH 0 NOCACHE NOORDER NOCYCLE ;
Viene utilizzato in una procedura memorizzata per inserire un record:
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;
Occasionalmente, questa procedura restituisce un errore quando eseguita dal codice dell'applicazione.
ORA-01400: cannot insert NULL into ("DALLAS"."X"."THE_ID")
ORA-06512: at "DALLAS.X_PKG", line 40
ORA-06512: at line 1
Dettagli che potrebbero essere o non essere rilevanti:
- Oracle Database 11g Enterprise Edition versione 11.2.0.1.0 - Produzione a 64 bit
- La procedura viene eseguita tramite Microsoft.Practices.EnterpriseLibrary - Data.Oracle.OracleDatabase.ExecuteReader (comando DbCommand)
- L'applicazione non avvolge la chiamata in una transazione esplicita.
- L'inserimento non riesce a intermittenza - meno dell'1%
In quali circostanze potrebbe x_seq.nextval
essere nullo?
v_id
viene fatto riferimento solo nella selezione sequenza, nell'inserimento e nel cursore finale. Il nostro prossimo passo è stato aggiungere il codice di debug. Potremmo dover attendere i risultati poiché ciò accade solo in produzione e molto raramente. C'è un trigger che si inserisce in una tabella di controllo. L'ho pettinato senza pistola fumante. Il problema si verifica occasionalmente anche in altre tabelle senza trigger. Grazie per dare un'occhiata.