GAUSS数据库函数select into没有数据报错解决方案

GaussDB(DWS)自定义函数查询无记录报错处理

Gaussdb(DWS)自定义函数中select into语句没有记录时报错处理-云社区-华为云

问题报错信息:在select查询时使用自定义的函数,结果报错,query returned no rows when  process INTO 

参照这个链接里的方法,把函数定义的begin-end中加上一个if判断或者直接用exception语句。

ps:链接里说使用exception,但是在GaussDB(DWS)中进入和退出一个包含exception子句的块要比不包含的块开销大的多,而且当存储过程/函数逻辑较为复杂时,语句走到exception分支可能会触发实例或节点重启等bug。

所以我这里最终尝试了两个方法,最终选择使用if加判断。

源代码:

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;

加exception

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

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;

给定引用中未提及Gauss数据库函数构造方法的相关内容,无法根据引用提供该问题的答案。不过一般来说,在GaussDB中构造函数可以遵循以下通用步骤(以PL/pgSQL语言为例): ### 函数创建语法 ```sql CREATE [OR REPLACE] FUNCTION function_name (parameter_list) RETURNS return_type AS $$ DECLARE -- 声明变量 variable_name data_type; BEGIN -- 函数体逻辑 -- 可以包含SQL语句、赋值语句、条件判断等 -- 例如: SELECT column_name INTO variable_name FROM table_name WHERE condition; -- 返回结果 RETURN variable_expression; END; $$ LANGUAGE plpgsql; ``` ### 解释 - `CREATE [OR REPLACE] FUNCTION`:用于创建一个新的函数,如果函数已经存在,`OR REPLACE` 可以覆盖原函数。 - `function_name`:函数的名称。 - `parameter_list`:函数的参数列表,每个参数由参数名和数据类型组成,多个参数用逗号分隔。 - `return_type`:函数的返回类型。 - `DECLARE` 部分:用于声明函数内部使用的变量。 - `BEGIN` 和 `END` 之间是函数体,包含具体的逻辑。 - `RETURN` 语句用于返回函数的结果。 - `LANGUAGE plpgsql`:指定函数使用的语言为PL/pgSQL。 ### 示例 ```sql -- 创建一个函数,用于计算两个整数的和 CREATE OR REPLACE FUNCTION add_numbers(a INTEGER, b INTEGER) RETURNS INTEGER AS $$ DECLARE result INTEGER; BEGIN result := a + b; RETURN result; END; $$ LANGUAGE plpgsql; -- 调用函数 SELECT add_numbers(1, 2); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值