发现问题
今天在执行某个存储过程的时候,遇到一个报错,提示我ORA-01403: 未找到任何数据
如图所示
问题分析
因为我的报错信息表里有记录着具体的报错位置,所以我很快的能够定位到问题所在,感觉这样找问题真的挺方便的,还是建议大家都把异常信息记录下来吧。
然后找到我的存储过程代码具体行
到这里差不多明白问题所在了,那是因为oracle中select into 语法不能将无结果集的数据赋值到变量中,那我们就要想办法把一个空或者默认值赋值给变量
解决问题
为了更好的模拟情况,我这边先创建一张空数据的测试表
create table TEST_USER
(name VARCHAR2(30),age NUMBER(3)
);
方案一
先查询一遍看看有没有数据,再决定赋不赋值,但这种办法一般不推荐,比较啰嗦
DECLARErow_count int;--记录行数v_name VARCHAR2(30);v_age int;
BEGINselect count(1) into row_count from TEST_USER where id=1;--大于0代表有数据if row_count>0 thenselect 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表赋值,强烈推荐!!!
DECLAREv_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赋值