обработка ошибок / исключений в Oracle - PullRequest
0 голосов
/ 15 декабря 2009

Я хочу разработать процедуру для следующего сценария.

У меня есть один источник, одна цель и одна таблица ошибок. Таблицы Target и Error имеют все поля, присутствующие в исходных таблицах. Но тип данных всех полей для таблицы ошибок varchar. Таблица ошибок не имеет целостности, внешнего ключа и других ограничений. В таблице ошибок также есть еще два поля: Ошибка и сообщение об ошибке.

Теперь, когда процедура выполняется, если при вставке какой-либо записи в цель возникает ошибка, эта запись будет перемещена в таблицу ошибок. Кроме того, код ошибки базы данных и сообщение об ошибке должны регистрироваться в полях таблиц ошибок, как упоминалось.

Как я могу разработать такую ​​процедуру?

Пример схемы таблицы:

source table  
    src(id number 
        ,name varchar2(20)  
        , ... )

target table  
    tgt(id number 
        ,name varchar2(20) not null 
        , ... )

error table  
    err (id varchar2(255) 
          ,name  varchar2(255)
          , ... 
          , errno varchar2(255)
          , errmsg varchar2(255))

Ответы [ 3 ]

4 голосов
/ 15 декабря 2009

Вы смотрели на собственные функции регистрации ошибок Oracle?

http://download.oracle.com/docs/cd/B19306_01/server.102/b14231/tables.htm#ADMIN10261

0 голосов
/ 16 декабря 2009
CREATE OR REPLACE PACKAGE BODY foo_dml IS

    PROCEDURE log_err (
        p_sqlcode IN NUMBER,
        p_sqlerrm IN VARCHAR2,
        p_src     IN foo%ROWTYPE
    ) IS
        -- inserts the input row to the err log
    BEGIN
        INSERT INTO err (
            errno,
            errmsg,
            ID,
            NAME,
            ...
        ) VALUES (
            p_sqlcode,
            p_sqlerrm,
            p_src.id,
            p_src.name,
            ...
        );
    END;

    PROCEDURE copy_to_tgt (
        p_src IN foo%ROWTYPE
    ) IS
        -- copies the input row to the tgt table
    BEGIN
        INSERT INTO
            tgt
        VALUES
            p_src;
    EXCEPTION
        WHEN OTHERS THEN
            log_err( SQLCODE, SQLERRM, p_src );
    END;

END;
/
0 голосов
/ 15 декабря 2009

Процедуры для этого могут выглядеть следующим образом:

procedure ins_tgt(p_id in number, p_name in varchar2, ...) is
  v_errno number; v_errmsg varchar2(2000);
begin
  insert into tgt(id, name, ...) values (p_id, p_name, ...);
exception
  when others then
    /* copy sqlcode and sqlerrm into variables since they can't be used directly in a SQL statement */
    v_errno := sqlcode;
    v_errmsg := sqlerrm;
    insert into err(id, name, errno, errmsg) values (p_id, p_name, v_errno, v_errmsg);
end;


procedure copy_src_tgt is
begin
  for s in (select * from src) loop
    ins_tgt(s.id, s.name, ...);
  end loop;
end;

но это кажется ужасным неэффективным способом копирования данных из одной таблицы в другую ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...