SELECT INTO STATEMENT
将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条
记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND)
例子:
BEGIN
SELECT col1,col2 into 变量1,变量2 FROM typestruct where xxx;
EXCEPTION
WHEN NO_DATA_FOUND THEN
xxxx;
END;
但是当查询SELECT INTO 时可能有多个记录 ,一个记录, 没有记录的情况。
一 当查询结果没有记录的时候会报错:data not found 错误。
为了防止这种错误,需要预先进行查询
可以在该语法之前,先利用select count(*) from 查看数据库中是否存在该记录,如果存在,再利用select...into...
或者添加异常处理模块:WHEN NO_DATA_FOUND THEN
when NO_DATA_FOUND then --未找到时
处理逻辑
when exception_code then --这里的错误代码可以在standard包中找到
处理逻辑
when OTHERS then --default错误时
处理逻辑
end;
错误代码可通过如下语句获得:
select * from dba_source where owner='SYS' and name='STANDARD' and type='PACKAGE' and text like ' pragma EXCEPTION%';
二 在使用SELECT …INTO语句时,变量名和数据表中的字段名不能相同,否则会出错。
例如:代码中变量名和数据表中的名为了区分开在变量名前加了【p_】用来区分变量名和数据表名。
> CREATE PROCEDURE get_address(
-> IN p_playerno SMALLINT,
-> OUT p_street VARCHAR(30),
-> OUT p_houseno VARCHAR(4),
-> OUT p_town VARCHAR(30),
-> OUT p_postcode VARCHAR(6))
-> BEGIN
-> SELECT street, houseno, town, postcode
-> INTO p_street, p_houseno, p_town, p_postcode
-> FROM PLAYERS
-> WHERE playerno = p_playerno;
-> END$$
三 在使用SELECT ....INTO时必须在字段后紧跟着INTO,不然会报错
select af.keynode into kn from APPFOUNDATION af where af.appid=aid and af.foundationid=fid;-- 有into,正确编译
select af.keynode from APPFOUNDATION af where af.appid=aid and af.foundationid=fid;-- 没有into,编译报错,提示:Compilation
Error: PLS-00428: an INTO clause is expected in this SELECT statement