ORACLE-1401 ошибка - PullRequest
       12

ORACLE-1401 ошибка

0 голосов
/ 06 января 2011

У меня есть хранимая процедура в 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)

Звонок EXEC SQL EXECUTE НАЧАТЬ keyadd (: id,: key,: wkey); КОНЕЦ; END-EXEC;

Хранимая процедура -

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]

Ответы [ 3 ]

1 голос
/ 07 января 2011
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. Таким образом, без дополнительной информации невозможно помочь.

1 голос
/ 06 января 2011

Я не знаю язык, на котором была написана процедура, но эта часть:

     EXCEPTION
         ROLLBACK;
     COMMIT;
         RETURN; 

поднимает брови. Два вопроса:

  • Что это должно делать?

  • Решена ли ваша проблема при удалении этих строк?

0 голосов
/ 06 января 2011

Моя лучшая догадка - ваша вторая попытка, вы предоставляете значение для одного из других столбцов, которое слишком велико.Похоже, эта ошибка заменит нарушение первичного ключа.

...