oracle数据库存储过程
在存储过程中执行一个sql语句,如果执行后没有结果,就会报错.想在结果为空的时候执行另一个操作,怎么判断结果为空呢?(结果为两个字段)
[最优解释]
是select into 语句吗?捕获异常后处理。
(如果是update语句,可以在update语句之后用if SQL%NOTFOUND then)
declare
l_name varchar2(100);
begin
select ename into l_name from emp where empno = 10;
dbms_output.put_line(l_name);
exception
when NO_DATA_FOUND then
dbms_output.put_line('not found');
end;
procedure pro_service_statistics is
v_sql varchar2(1000);
v_obj varchar2(500);
v_num number;
v_date date;
--v_error varchar2(1000);
v_state number;
v_detail varchar(1000);
v_id number;
v_ename varchar2(500);
v_cname varchar2(1000);
v_flag number;
cursor cur_cursor is
select p.config_code, p.config_name from t_custom_table p;
cursor cur_Fcursor is
select t.service_id, t.english_name, t.chinese_name
from t_service_statistics t
where t.garther_date >= trunc(sysdate)
and t.flag = 0;
begin
--如果当天有没有成功的数据
if cur_Fcursor%notfound then --这里就报错了
for fitem in cur_Fcursor loop
pro_get_statistics(fitem.english_name, v_sql);
--做更新操作
v_id := fitem.service_id;
v_ename := fitem.english_name;
v_cname := fitem.chinese_name;
v_state := 1;
-- v_flag
end loop;
else
for titem in cur_cursor loop
pro_get_statistics(titem.config_code, v_sql);
--做更新操作
v_ename := titem.config_code;
v_cname := titem.config_name;
v_state := 2;
end loop;
end if;
DECLARE
CURSOR CUR_P IS
SELECT P.CONFIG_CODE, P.CONFIG_NAME FROM T_CUSTOM_TABLE P;
BEGIN
OPEN CUR_P; --必须打开游标,否则会报 ORA-01001: 无效的游标 错误
--第一种,FOUND 后台打印出FOUND
IF NVL(CUR_P%FOUND,TRUE) THEN
DBMS_OUTPUT.PUT_LINE(''
[其他解释]
'==>'
[其他解释]
'FOUND');
END IF;
--第二种,NOTFOUND 后台打印出FOUND
IF NVL(CUR_P%NOTFOUND,TRUE) THEN
DBMS_OUTPUT.PUT_LINE(''
[其他解释]
'==>'
[其他解释]
'NOTFOUND');
END IF;
--第三种,输出了NOTFOUND
IF CUR_P%NOTFOUND IS NULL THEN
DBMS_OUTPUT.PUT_LINE(''
[其他解释]
'==>'
[其他解释]
'NOTFOUND');
END IF;
--由此看来,打开游标之后,如果不用FETCH语句的话,返回的是空! 也就是NULL!!
CLOSE CUR_P;
END;