使用 DBMS_OUTPUT.put_line 显示错误消息

Posted

技术标签:

【中文标题】使用 DBMS_OUTPUT.put_line 显示错误消息【英文标题】:Display error message using DBMS_OUTPUT.put_line 【发布时间】:2015-12-01 18:54:45 【问题描述】:

我的要求是编写一个在COUNTRIES 表中添加值的过程。但是,首先它应该检查对应的值是否存在于另一个表中,REGIONS 因为它是一个外键。只有值存在时才允许插入COUNTRIES 表。否则,不行。

我写了一段代码并且运行良好:

create or replace procedure addi3 (c_cntry_id  in out countries.country_id%type,
                                   c_cntr_name in countries.country_name%type, 
                                   c_rgn_id    in countries.region_id%type)
is
    region_exists pls_integer;
begin
    begin
        select 1 into region_exists
        from regions r 
        where r.region_id = c_rgn_id;
    exception
      when no_data_found then
        region_exists := 0;
        DBMS_OUTPUT.PUT_LINE('Already present');    
    end;

    if region_exists = 1 then
      insert into countries(country_id, country_name,region_id)
      values (c_cntry_id, c_cntr_name,c_rgn_id);

      DBMS_OUTPUT.PUT_LINE('Inserted');
    end if;
end addi3;
/

它工作正常,除了如果我通过提供区域表中不存在的region_id 来执行该过程,它不会正确地插入国家表中。但是,如果region_id 不存在并且即使我有DBMS_OUTPUT.put_line,它也没有显示适当的错误消息,我想通过使用DBMS_OUTPUT.put_line 引发错误来增强它。有人可以指导一下吗?

【问题讨论】:

您的会话是否开启了 SERVEROUTPUT?如果没有,您将不得不手动获取“已经存在”或“已插入”消息。 是的,我在执行过程之前做了:“set serverout on” 当你说你想让它“抛出一个错误”时,你的意思是你想让它说一些除了当前的“已经存在”之外的东西吗?还是它实际上引发了异常并退出程序? 是的,当 region_id 不存在时,在我的情况下说“已经存在”。(实际上,它应该是“不存在”,但我想一旦错误消息可见就可以更正跨度> 如果该区域不存在 - 这不是应该插入的时候吗? 【参考方案1】:

根据您在 cmets 中的请求编辑您的代码:

create or replace procedure addi3 (c_cntry_id in out countries.country_id%type,
                                       c_cntr_name in countries.country_name%type, 
                                       c_rgn_id in countries.region_id%type)
is
    region_exists pls_integer;
begin
    begin
        select 1 into region_exists
        from regions r 
        where r.region_id = c_rgn_id;
    exception
        when no_data_found then
            region_exists := 0;
            DBMS_OUTPUT.PUT_LINE('Region not present '||sqlerrm);
            -- uncomment the RAISE if you want the exception to be
            -- propagated back to the calling code.
            --RAISE;

    end;
    -- if you uncommented the RAISE the IF here is redundant
    -- because you wouldn't have got here if the region didn't exist.
    if region_exists = 1 then
         insert into countries(country_id, country_name,region_id)
         values (c_cntry_id, c_cntr_name, c_rgn_id);
         DBMS_OUTPUT.PUT_LINE('Inserted');
     end if;
end addi3;
/

【讨论】:

以上是关于使用 DBMS_OUTPUT.put_line 显示错误消息的主要内容,如果未能解决你的问题,请参考以下文章

Oracle PL/SQL 的 dbms_output.put_line() 与 dbms_output.put()

Oracle 中的dbms_output.put_line

Oracle 中的dbms_output.put_line

DBMS_OUTPUT.PUT_LINE 抛出“PL/SQL:数字或值错误”

dbms_output.put_line 的替代方案

如何在 Dbms_output.put_line(''); 中使用 <br> 标签在 PL/SQL 甲骨文中?