【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异常。
推荐阅读
- PostgreSQL递归查询
- Python实现七段数码管时钟(动态刷新版)
- 一张纸(5毫米)折叠多少次可以达到珠穆朗玛峰的高度(8848米)()
- 如何在cmd命令行下切换目录
- N62-1
- Android Studio实现QQ的注册登录和好友列表界面的跳转
- 企业内网如何搭建安全的Harbor服务((超详细))
- 番外篇客户端开发(Electron)无源码如何做汉化
- 客户端开发(Electron)加入Vue2.6