发现问题
今天在执行某个存储过程的时候,遇到一个报错,提示我ORA-01403: 未找到任何数据
如图所示
问题分析
因为我的报错信息表里有记录着具体的报错位置,所以我很快的能够定位到问题所在,感觉这样找问题真的挺方便的,还是建议大家都把异常信息记录下来吧。
然后找到我的存储过程代码具体行
到这里差不多明白问题所在了,那是因为oracle中select into 语法不能将无结果集的数据赋值到变量中,比如我们写存储过程、函数、触发器等,假如有使用到select into,那就要想办法把一个空或者默认值赋值给变量,不然都会提示这个错误信息
解决问题
为了更好的模拟情况,我这边先创建一张空数据的测试表
create table TEST_USER
(
name VARCHAR2(30),
age NUMBER(3)
);
方案一
先查询一遍看看有没有数据,再决定赋不赋值,但这种办法一般不推荐,比较啰嗦
DECLARE
row_count int;--记录行数
v_name VARCHAR2(30);
v_age int;
BEGIN
select count(1) into row_count from TEST_USER where id=1;
--大于0代表有数据
if row_count>0 then
select name,age into v_name,v_age from TEST_USER where id=1;
end if;
DBMS_OUTPUT.PUT_LINE('v_name:'|| v_name || ', v_age: ' || to_char(v_age));
END;
方案二
利用dual表赋值,强烈推荐!!!
DECLARE
v_name VARCHAR2(30);
v_age int;
BEGIN
-- 单字段赋值(适用: 只查一个字段、查询字段少且SQL短)
SELECT (select name from TEST_USER where id=1) INTO v_name FROM DUAL;
SELECT (select age from TEST_USER where id=1) INTO v_age FROM DUAL;
DBMS_OUTPUT.PUT_LINE('v_name:'|| v_name || ', v_age: ' || to_char(v_age));
-- 多字段赋值(使用: 查多个字段或SQL比较复杂)
WITH TEMP AS (
select name,age from TEST_USER where id=1
)
SELECT (SELECT name FROM temp),(SELECT age FROM temp) INTO v_name, v_age FROM dual;
DBMS_OUTPUT.PUT_LINE('v_name:'|| v_name || ', v_age: ' || to_char(v_age));
END;
总结
赋值单字段或较少字段, SQL简单的情况,则可以采用单字段SQL赋值
赋值较多字段或多字段, SQL复杂的情况, 则可以采用 WITH TEMP AS + DUAL赋值