我想做这样一个存储过程功能:Oracle中通过输入一个条件查询一条数据,没有此数据则做操作1,有此数据则做操作2
代码:
create or replace procedure test(studentid)
....
select * from student where sid=studentid
if sql%count=1 then
    begin
        操作1
    end
end if;
if sql%count=0 then
    begin
        操作2
    end
end if;
....
存储过程编译没有错,但是执行起来报错:ORA-01403: 未找到数据为什么呢?难道没有执行判断sql%count的操作?怎么解决呢?谢谢大家了!

解决方案 »

  1.   

    create or replace procedure test(studentid) 
    .... 
       num int;
    .....
    select count(*) into num from student where sid=studentid 
    if num=1 then 
        begin 
            操作1 
        end 
    end if; 
    if num=0 then 
        begin 
            操作2 
        end 
    end if; 
    ....
      

  2.   

    sql%count有这个写法,很熟悉,想不起来哪里见过网上查了下,也没有找到哦 楼主提点下select count(*) into num
    都用楼上的做法
      

  3.   

    恩 用liusong_china的方法可以解决我的问题,先谢谢了!
    不过我还是想知道 Sql%rowcount碰到这种问题是怎么解决了!!嘿嘿,这个是题外话!!
      

  4.   

    SQL%ROWCOUNT 在执行任何DML语句之前,SQL%ROWCOUNT的值都是NULL,对于SELECT INTO语句,如果执行成功,SQL%ROWCOUNT的值为1,如果没有成功,SQL%ROWCOUNT的值为0,同时产生一个异常NO_DATA_FOUND.
      

  5.   

    SQL%FOUND和SQL%NOTFOUND  在执行任何DML语句前SQL%FOUND和SQL%NOTFOUND的值都是NULL,在执行DML语句后,SQL%FOUND的属性值将是:  . TRUE :INSERT  . TRUE :DELETE和UPDATE,至少有一行被DELETE或UPDATE.  . TRUE :SELECT INTO至少返回一行  当SQL%FOUND为TRUE时,SQL%NOTFOUND为FALSE。  SQL%ROWCOUNT  在执行任何DML语句之前,SQL%ROWCOUNT的值都是NULL,对于SELECT INTO语句,如果执行成功,SQL%ROWCOUNT的值为1,如果没有成功,SQL%ROWCOUNT的值为0,同时产生一个异常NO_DATA_FOUND.
    我觉得你应该用的是 SQL%FOUND和SQL%NOTFOUND
      

  6.   

    你这里说的是Sql%rowcount
    可你代码里是sql%count
    ???
      

  7.   

    额代码是没有什么问题的
    在这里是写错了 ,但是在代码里是Sql%rowcount
      

  8.   

    回复:WWWTYB
    SQL%FOUND和SQL%NOTFOUND 用过额
    对于一句Sql语句可以正确执行
    但是如果同时有多对SQL%FOUND、SQL%NOTFOUND的时候,好像结果不是想象中的那样。
    也就是说对于执行结果来说,Sql%rowcount更好一点
    所以我想知道在具体示例中 Sql%rowcount是怎么用的。。
    嘿嘿~
      

  9.   

    SQL%ROWCOUNT  在执行任何DML语句之前,SQL%ROWCOUNT的值都是NULL,对于SELECT INTO语句,如果执行成功,SQL%ROWCOUNT的值为1,如果没有成功,SQL%ROWCOUNT的值为0,同时产生一个异常NO_DATA_FOUND.
      

  10.   

    SQL%ROWCOUNT  在执行任何DML语句之前,SQL%ROWCOUNT的值都是NULL,对于SELECT INTO语句,如果执行成功,SQL%ROWCOUNT的值为1,如果没有成功,SQL%ROWCOUNT的值为0,同时产生一个异常NO_DATA_FOUND.
      

  11.   


    select * from student where sid=studentid  
    如果数据库中没有这条信息,那么肯定是select into 执行失败了 ,那么肯定返回sql%rowcount=0喽,那我下面做的判断应该有效喽?可惜事情真相不是这样额【更正Sql查询语句额:select name into name_temp from student where sid=studentid】
      

  12.   

    SQL> set serveroutput on;
    SQL> declare
      2  Cursor c1 is select 1 from dual;
      3  begin
      4  for c2 in c1 loop
      5  if c1%rowcount > 0 then
      6  dbms_output.put_line(c1%rowcount);
      7  end if;
      8  end loop;
      9  end;
     10  /
    1PL/SQL procedure successfully completed
      

  13.   


    也就是说%rowcount必须在声明游标的情况下并且在游标中使用吗?
      

  14.   

    呵呵
    楼主你响一下%ROWCOUNT的定义是什么把SELECT换成UPDATE、DELETE、INSERT 试试就知道了
      

  15.   

    13#说的是%ROWCOUNT是显示和游标结合使用时候的情况楼主说的sql%ROWCOUNT应该是隐式游标
      

  16.   

    SQL> select * from t11;        ID NAME
    ---------- --------------------
             2 ha
             1 ha
             4 ha
             3 ha
    SQL> set serveroutput on
    SQL> begin
      2        update   t11   set   name='he';
      3        if   sql%rowcount   >   1   then
      4            dbms_output.put_line('at   least   one   record   updated.');
      5        else
      6            dbms_output.put_line('no   record   updated.');
      7        end   if;
      8    end;
      9  /
    at   least   one   record   updated.PL/SQL procedure successfully completed.
      

  17.   

    对。我Sql语句中的Sql%rowcount是隐式游标。
    嘿嘿,忽视了DML语句了~
    DML是数据操纵语言,主要包括insert,delete,update等语句,是对表中数据的一些操作
    怪不得Select没有反应呢,谢谢大家了!