Ich habe eine Oracle-Sequenz wie folgt definiert:
CREATE SEQUENCE "DALLAS"."X_SEQ"
MINVALUE 0
MAXVALUE 999999999999999999999999999
INCREMENT BY 1 START WITH 0 NOCACHE NOORDER NOCYCLE ;
Es wird in einer gespeicherten Prozedur verwendet, um einen Datensatz einzufügen:
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;
Gelegentlich gibt diese Prozedur einen Fehler zurück, wenn sie aus dem Anwendungscode ausgeführt wird.
ORA-01400: cannot insert NULL into ("DALLAS"."X"."THE_ID")
ORA-06512: at "DALLAS.X_PKG", line 40
ORA-06512: at line 1
Details, die relevant sein können oder nicht:
- Oracle Database 11g Enterprise Edition Version 11.2.0.1.0 - 64-Bit-Produktion
- Die Prozedur wird über Microsoft.Practices.EnterpriseLibrary - Data.Oracle.OracleDatabase.ExecuteReader (Befehl DbCommand) ausgeführt.
- Die Anwendung schließt den Aufruf nicht in eine explizite Transaktion ein.
- Der Einsatz fällt zeitweise aus - weniger als 1%
Unter welchen Umständen könnte x_seq.nextval
null sein?
v_id
wird nur in der Sequenzauswahl, dem Einfügen und dem letzten Cursor referenziert. Unser nächster Schritt war das Hinzufügen des Debugging-Codes. Wir müssen möglicherweise auf Ergebnisse warten, da dies nur in der Produktion und sehr selten vorkommt. Es gibt einen Trigger, der in eine Prüftabelle eingefügt wird. Ich habe es ohne rauchende Waffe durchgekämmt. Das Problem tritt gelegentlich auch in anderen Tabellen ohne Trigger auf. Vielen Dank für Ihren Blick.