0

テーブルにデータを挿入するパッケージに次のコードがあります。

親キーが見つからない例外を取得できます。各列の制約違反メッセージを具体的に取得するにはどうすればよいですか? たとえば、proj_id違反している場合は例外を発生させ、proj_code違反している場合は別の例外を発生させます。

PROCEDURE add_project(
     p_proj_id              project.proj_id%TYPE,
     p_proj_desc        project.proj_desc%TYPE,
     p_proj_code  project.proj_code%TYPE,
     p_proj_date      project.proj_date%TYPE
     )
      IS
    parent_not_found exception;
    pragma exception_init(parent_not_found, -2291);
     BEGIN
        INSERT
            INTO projects (proj_id,proj_desc,proj_code,proj_date) values
                  (p_proj_id,p_proj_desc,p_proj_code,p_proj_date);
exception
when parent_not_found then
raise_application_error(-20001,'Invalid');
     END;
4

2 に答える 2

2

EXCEPTION_INIT プラグマを見てください。

DECLARE
    l_parentnotfound    exception;
    l_res               integer;
    PRAGMA EXCEPTION_INIT(l_parentnotfound, -2291);
BEGIN
    -- check if the parent key exists
    select 1 into l_res from codes where code = proj_code;
    -- if not, raise exception
    if l_res <> 1 then
        raise l_parentnotfound;
    end if;
    INSERT INTO projects (proj_id,proj_desc,proj_code,proj_date) values (p_proj_id,p_proj_desc,p_proj_code,p_proj_date);
EXCEPTION WHEN l_parentnotfound THEN
    -- handle the error
END;

または、 を使用WHEN OTHERSして探すこともできますSQLCODE

編集

例外を発生させるために親キーが存在することを手動で確認する必要はないことに注意してください。

DECLARE
    l_parentnotfound    exception;
    l_res               integer;
    PRAGMA EXCEPTION_INIT(l_parentnotfound, -2291);
BEGIN
    INSERT INTO projects (proj_id,proj_desc,proj_code,proj_date) values (p_proj_id,p_proj_desc,p_proj_code,p_proj_date);
EXCEPTION WHEN l_parentnotfound THEN
    -- handle the error
END;

ただし、違反した制約名を簡単に取得できるようにしたい場合は、列ごとに手動で例外を発生させると便利です。USER_CONSTRAINTSまた、 andを使用して制約名を取得することもできますUSER_CONS_COLUMNS

SQLERRM違反した制約名を取得する別の方法は、エラー メッセージを解析することです。

于 2013-09-26T12:28:28.817 に答える