我想做这样一个存储过程功能: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的操作?怎么解决呢?谢谢大家了!
代码:
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的操作?怎么解决呢?谢谢大家了!
....
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;
....
都用楼上的做法
不过我还是想知道 Sql%rowcount碰到这种问题是怎么解决了!!嘿嘿,这个是题外话!!
我觉得你应该用的是 SQL%FOUND和SQL%NOTFOUND
可你代码里是sql%count
???
在这里是写错了 ,但是在代码里是Sql%rowcount
SQL%FOUND和SQL%NOTFOUND 用过额
对于一句Sql语句可以正确执行
但是如果同时有多对SQL%FOUND、SQL%NOTFOUND的时候,好像结果不是想象中的那样。
也就是说对于执行结果来说,Sql%rowcount更好一点
所以我想知道在具体示例中 Sql%rowcount是怎么用的。。
嘿嘿~
select * from student where sid=studentid
如果数据库中没有这条信息,那么肯定是select into 执行失败了 ,那么肯定返回sql%rowcount=0喽,那我下面做的判断应该有效喽?可惜事情真相不是这样额【更正Sql查询语句额:select name into name_temp from student where sid=studentid】
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
也就是说%rowcount必须在声明游标的情况下并且在游标中使用吗?
楼主你响一下%ROWCOUNT的定义是什么把SELECT换成UPDATE、DELETE、INSERT 试试就知道了
---------- --------------------
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.
嘿嘿,忽视了DML语句了~
DML是数据操纵语言,主要包括insert,delete,update等语句,是对表中数据的一些操作
怪不得Select没有反应呢,谢谢大家了!