使用 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()