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

【select into 时有无strict关键字的区别】青春须早为,岂能长少年。这篇文章主要讲述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异常。

    推荐阅读