【发布时间】:2011-06-04 17:47:55
【问题描述】:
我在 Oracle 9i 中有一个在表中插入记录的存储过程。该表有一个主键,以确保不存在重复的行。
我试图通过调用这个存储过程来插入一条记录,它第一次正常工作。我再次尝试插入重复记录并期待唯一约束违规错误。但我越来越 ORA-01401 插入的值对于列来说太大
我知道它的意思,但我的查询是,如果插入的值真的很大,那么它是如何在第一次尝试中成功的。
表是
CREATE TABLE KEY
(
ID VARCHAR2(25 BYTE),
KEY NUMBER(4) NOT NULL,
INSERT_DATE DATE,
WORK_KEY VARCHAR2(128 BYTE)
)
CREATE UNIQUE INDEX SACHINIDX ON KEY
(ID, KEY)
调用是 执行 SQL 执行 开始 keyadd(:id, :key, :wkey); 结尾; 结束执行;
存储过程是
PROCEDURE keyadd(id IN VARCHAR2, key IN NUMBER, wkey IN VARCHAR2)
{
BEGIN
INSERT INTO KEY
( ID,
KEY,
INSERT_DATE,
WORK_KEY)
VALUES
(
id,
key,
SYSDATE,
wkey
);
EXCEPTION
ROLLBACK;
COMMIT;
RETURN;
END;
}
首先插入 sqlca.sqlcode 为 [0] 第二次插入 sqlca.sqlcode 为 [-1401]
【问题讨论】:
-
表上是否有任何可能与值混淆的触发器?
-
你能给我们展示一个重现这种行为的小测试用例吗?
-
请同时显示存储过程和调用。
-
第一次和第二次调用中
wkey的值是多少? -
查看这些值应该对此有所帮助。您可以使用
DBMS_OUTPUT.put_line()将值记录到控制台。
标签: oracle stored-procedures plsql