首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > oracle >

oracle数据库存储过程,该怎么处理

2013-03-26 
oracle数据库存储过程在存储过程中执行一个sql语句,如果执行后没有结果,就会报错.想在结果为空的时候执行

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;

[其他解释]
if SQL%NOTFOUND then
...
end if
[其他解释]
可以说明白点吗?
[其他解释]
试试这个:
RecordCount number;

select count(1) from table into RecordCount where ……;

if RecordCount = 0 then 
……
end if;
[其他解释]
只有update语句才能用SQL %NOTFOUND 吗?我的是查询语句诶...
[其他解释]
 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;


不是这么个判断游标是否为空的吗?我看的资料全部都是这样诶,不知道为什么会报错,各位指点迷津啊~~~~~
[其他解释]
能知道报告的是啥错误么
[其他解释]
你的CURSOR没有被打开吧
[其他解释]
报错为:ORA-01001: 无效的游标
这样查询出来的游标还要open吗,我之前的都没有啊,那可以直接用的吧...
[其他解释]
刚刚测试了一下,你的这种写法是有问题的,如下:

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;

我的异常网推荐解决方案:oracle存储过程,http://www.myexception.cn/oracle-develop/177537.html

热点排行