【问题标题】:ORACLE -1401 errorORACLE -1401 错误
【发布时间】: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


【解决方案1】:

我不知道程序是用什么语言编写的,但是这部分:

     EXCEPTION
         ROLLBACK;
     COMMIT;
         RETURN; 

我扬了扬眉毛。两个问题:

  • 这是做什么的?

  • 删除这些行后问题解决了吗?

【讨论】:

  • 这两行有什么问题?以及为什么需要删除它们
  • 首先,在EXCEPTION关键字后面需要一个WHEN子句。其次,回滚后立即提交是没有目的的。我怀疑这与您的错误直接相关,但显然您显示的代码不是实际代码。
  • @Sachin:仍在等待答案。也许这是一些非常糟糕的复制 PL/SQL?
【解决方案2】:
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);


create or replace PROCEDURE keyadd(id IN VARCHAR2, key IN NUMBER, wkey IN VARCHAR2)
is
        BEGIN
        INSERT INTO KEY
            (   ID,
                KEY,
                INSERT_DATE,
                WORK_KEY)
            VALUES
            (
                id,
                key,
                SYSDATE,
                wkey
            );

        COMMIT;

--      EXCEPTION when others then
--          ROLLBACK;
end keyadd;
/

begin
  keyadd('one', 1, '59FC9AD0FA5A8932836824B0489B73252C120301A2205154C096B4EB213FA983D5E500B62A469439');
  keyadd('one', 1, '905BD61AAEC986ACF887DBA7C04D650B61A8818ABEBE1720D810B4A426EB9220558B530D5119315F');
end;
/

给了我预期的ORA-00001: Unique Constraint... 错误,而不是 ORA-01401。因此,如果没有更多信息,就无法提供帮助。

【讨论】:

    【解决方案3】:

    我最好的猜测是在您第二次尝试时,您为其他列之一提供了一个太大的值。看起来这个错误将取代主键违规。

    【讨论】:

    • 所有的值是相同的所期望的最后column.For第一呼叫其59FC9AD0FA5A8932836824B0489B73252C120301A2205154C096B4EB213FA983D5E500B62A469439和第二其905BD61AAEC986ACF887DBA7C04D650B61A8818ABEBE1720D810B4A426EB9220558B530D5119315F。我看不出长度有什么区别。 :(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-05
    • 2011-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多