Gaussdb(DWS)自定义函数中select into语句没有记录时报错处理
【摘要】 存储过程/函数中使用select into语句将查询结果赋值给某个变量时,如果查询没有记录,则会发生报错:query returned no rows when process INTO。如果将存储过程/函数中的语句单独运行,则不会报错。这是因为在函数中返回结果为null时,无法通过select into语句进行变量赋值,而单独运行变量则会自动创建为一张表,类似于create table a...
存储过程/函数中使用select into语句将查询结果赋值给某个变量时,如果查询没有记录,则会发生报错:query returned no rows when process INTO。如果将存储过程/函数中的语句单独运行,则不会报错。这是因为在函数中返回结果为null时,无法通过select into语句进行变量赋值,而单独运行变量则会自动创建为一张表,类似于create table as selct语法。
针对这种情况,可以在存储过程/函数中使用exception分支捕获错误语句,使其跳过报错返回一个给定值。但是在GaussDB(DWS)中进入和退出一个包含exception子句的块要比不包含的块开销大的多,而且当存储过程/函数逻辑较为复杂时,语句走到exception分支可能会触发实例或节点重启等bug。因此,不必要的时候不建议使用exception。这时,可以使用if语句对查询结果进行判断,当查询结果为0时,直接返回0,否则进行正常赋值。
如下操作为测试过程。
创建表,并导入测试数据:
create table tab1019(id int,name varchar2(10));
insert into tab1019 values(1001,'shanghai');
insert into tab1019 values(1002,'beijing');
insert into tab1019 values(1003,'guangzhou');
insert into tab1019 values(1004,'chongqing');
创建测试函数:
CREATE OR REPLACE FUNCTION func_tab1019(is_name varchar2)
RETURN varchar2
AS
DECLARE
v_result varchar2;
BEGIN
select name into v_result from tab1019 where id =is_name;
RETURN v_result;
END;
/
- 当查询结果为null时,发生报错:
- 单独运行函数中的语句,结果为空但不报错:
- 修改函数定义,使用exception分支捕获错误语句,当没有数据时,返回0:
CREATE OR REPLACE FUNCTION func_tab1019(is_name varchar2)
RETURN varchar2
AS
DECLARE
v_result varchar2;
BEGIN
select name into v_result from tab1019 where id =is_name;
RETURN v_result;
EXCEPTION
WHEN no_data_found THEN
RETURN '0';
END;
/
- 修改函数定义,使用if语句进行判断,当查询结果为0时,直接返回0,否则进行正常赋值:
CREATE OR REPLACE FUNCTION func_tab1019(is_name varchar2)
RETURN varchar2
AS
DECLARE
v_result varchar2;
BEGIN
select count(*) into v_result from tab1019 where id =is_name;
if v_result <> '0' then
select name into v_result from tab1019 where id =is_name;
RETURN v_result;
else
RETURN '0';
end if;
END;
/
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)