Gaussdb(DWS)自定义函数中select into语句没有记录时报错处理

举报
i云上小白 发表于 2023/10/19 15:06:16 2023/10/19
【摘要】 存储过程/函数中使用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时,发生报错:

1.png

  • 单独运行函数中的语句,结果为空但不报错:

2.png

  • 修改函数定义,使用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;
/

3.png

  • 修改函数定义,使用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;
/

4.png


 

 

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。