Saya memiliki urutan Oracle yang didefinisikan seperti ini:
CREATE SEQUENCE "DALLAS"."X_SEQ"
MINVALUE 0
MAXVALUE 999999999999999999999999999
INCREMENT BY 1 START WITH 0 NOCACHE NOORDER NOCYCLE ;
Ini digunakan dalam prosedur tersimpan untuk memasukkan catatan:
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;
Kadang-kadang, prosedur ini mengembalikan kesalahan ketika dijalankan dari kode aplikasi.
ORA-01400: cannot insert NULL into ("DALLAS"."X"."THE_ID")
ORA-06512: at "DALLAS.X_PKG", line 40
ORA-06512: at line 1
Detail yang mungkin relevan atau tidak relevan:
- Oracle Database 11g Edisi Perusahaan Rilis 11.2.0.1.0 - Produksi 64bit
- Prosedur dieksekusi melalui Microsoft.Practices.EnterpriseLibrary - Data.Oracle.OracleDatabase.ExecuteReader (perintah DbCommand)
- Aplikasi tidak membungkus panggilan dalam transaksi eksplisit.
- Sisipan gagal sebentar-sebentar - kurang dari 1%
Dalam keadaan apa bisa x_seq.nextval
nol?
v_id
hanya direferensikan dalam urutan pilih, masukkan, dan kursor akhir. Langkah kami selanjutnya adalah menambahkan kode debug. Kita mungkin harus menunggu hasil karena hanya terjadi dalam produksi dan sangat jarang. Ada pemicu yang menyisipkan ke dalam tabel audit. Saya sudah menyisirnya tanpa pistol merokok. Masalahnya juga kadang-kadang terjadi di tabel lain tanpa pemicu. Terima kasih telah melihatnya.