У мене така послідовність Oracle визначена так:
CREATE SEQUENCE "DALLAS"."X_SEQ"
MINVALUE 0
MAXVALUE 999999999999999999999999999
INCREMENT BY 1 START WITH 0 NOCACHE NOORDER NOCYCLE ;
Він використовується в збереженій процедурі для вставки запису:
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;
Інколи ця процедура повертає помилку при виконанні з коду програми.
ORA-01400: cannot insert NULL into ("DALLAS"."X"."THE_ID")
ORA-06512: at "DALLAS.X_PKG", line 40
ORA-06512: at line 1
Деталі, які можуть бути або не бути актуальними:
- Випуск бази даних Oracle 11g Enterprise Edition 11.2.0.1.0 - 64-бітне виробництво
- Процедура виконується за допомогою Microsoft.Practices.EnterpriseLibrary - Data.Oracle.OracleDatabase.ExecuteReader (команда DbCommand)
- Додаток не завершує виклик у явній транзакції.
- Вставка виходить з перервами - менше 1%
За яких обставин може x_seq.nextval
бути недійсним?
v_id
посилається лише на вибір послідовності, вставку та кінцевий курсор. Наступним нашим кроком було додати код налагодження. Нам, можливо, доведеться чекати результатів, оскільки це відбувається лише у виробництві і дуже рідко. Існує тригер, який вставляється в таблицю аудиту. Я прочесав це через не палючий пістолет. Проблема також періодично виникає в інших таблицях без тригерів. Дякуємо, що подивились.