select into 时有无strict关键字的区别

Posted 瀚高PG实验室

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了select into 时有无strict关键字的区别相关的知识,希望对你有一定的参考价值。

瀚高数据库
目录
文档用途
详细信息

文档用途
介绍说明在select into语法中有无strict关键字的区别。

详细信息
一个产生单一行(可能有多个列)的 SQL 命令的结果可以被赋值给一个记录变量、行类型变量或标量变量行域列表。这通过书写基础 SQL 命令并增加一个INTO子句来达成。例如:

SELECT select_expressions INTO [STRICT] target FROM ...;

如果STRICT没有在INTO子句中被指定,那么target将被设置为该查询返回的第一个行,或者在该查询不返回行时设置为空。第一行之后的任何结果行都会被抛弃。你可以检查特殊的FOUND变量来确定是否返回了一行:

SELECT * INTO myrec FROM emp WHERE empname = myname;

IF NOT FOUND THEN

    RAISE EXCEPTION 'employee % not found', myname;

END IF;

如果指定了STRICT选项,该查询必须刚好返回一行或者将会报告一个运行时错误,该错误可能是NO_DATA_FOUND(没有行)或TOO_MANY_ROWS(多于一行)。如果你希望捕捉该错误,可以使用一个异常块,例如:

BEGIN

    SELECT * INTO STRICT myrec FROM emp WHERE empname = myname;

    EXCEPTION

        WHEN NO_DATA_FOUND THEN

            RAISE EXCEPTION 'employee % not found', myname;

        WHEN TOO_MANY_ROWS THEN

            RAISE EXCEPTION 'employee % not unique', myname;

END;

成功执行一个带STRICT的命令总是会将FOUND置为真。

测试实例:

create table strict_test_tb (id int,content varchar);



create or replace function test_no_strict() returns varchar as $$

declare

  param1 strict_test_tb%rowtype;

  

begin

 begin

    select * into param1 from strict_test_tb;

    EXCEPTION

  	  WHEN NO_DATA_FOUND THEN

    RAISE EXCEPTION 'param1 % not found', '1';

  	  WHEN TOO_MANY_ROWS THEN

    RAISE EXCEPTION 'param1 % not unique', '2';

      when others then

    RAISE exception 'other unkown exception';  

   end;

   RAISE notice 'param1 is %',param1;

   return null;

end;  



$$ language plpgsql;    



create or replace function test_has_strict() returns varchar as $$

declare

  param1 strict_test_tb%rowtype;

begin  

 begin



    select * into strict param1 from strict_test_tb;

    EXCEPTION

  	  WHEN NO_DATA_FOUND THEN

    RAISE EXCEPTION 'param1 % not found', '1';

  	  WHEN TOO_MANY_ROWS THEN

    RAISE EXCEPTION 'param1 % not unique', '2';

  end;

   raise notice 'param1 is %',param1;

   return null;

end;

$$ language plpgsql;  

当没有数据被返回时:

highgo=# select * from strict_test_tb;

 id | content 

----+---------

(0 rows)



highgo=# select test_no_strict();

NOTICE:  param1 is (,)

 test_no_strict 

---------------- 

(1 row)

highgo=# select test_has_strict();

ERROR:  param1 1 not found

CONTEXT:  PL/pgSQL function test_has_strict() line 10 at RAISE

当有一数据被返回时:

highgo=# select test_no_strict();

NOTICE:  param1 is (1,1)

 test_no_strict 

---------------- 

(1 row)



highgo=# select test_has_strict();

NOTICE:  param1 is (1,1)

 test_has_strict 

-----------------

(1 row)

当有多条数据被返回时:

highgo=# select test_no_strict();

NOTICE:  param1 is (1,1)

 test_no_strict 

----------------

 

(1 row)

highgo=# select test_has_strict();

ERROR:  param1 2 not unique

CONTEXT:  PL/pgSQL function test_has_strict() line 12 at RAISE

结论:

select into 当没有数据被返回时,返回null,当有多条数据被返回时,对变量赋值第一条。

select into strict 当没有数据被返回时,产生no_data_found异常;当有多条数据被返回时,产生too_many_rows异常。

以上是关于select into 时有无strict关键字的区别的主要内容,如果未能解决你的问题,请参考以下文章

select into 时有无strict关键字的区别

PostgreSQL使用select into时有无STRICT关键字的区别

PostgreSQL使用select into时有无STRICT关键字的区别

mybatis 调用 oracle 存储过程 select into 无记录时NO_DATA_FOUND异常处理分析

具有 into 关键字的动态 SQL Select 语句

Oracle SQL:使用带有递归 CTE 的 SELECT INTO 时出现“缺少关键字”