我想使用函数SQL%ROWCOUNT作为告诉我记录是否在表中的方法。 我的代码如下:
DECLARE
v_emp employee%ROWTYPE;
CURSOR c_emp IS
SELECT * FROM employee WHERE name='chuck';
BEGIN
OPEN c_emp;
FETCH c_emp INTO v_emp;
IF SQL%ROWCOUNT=1 THEN
DBMS_OUTPUT.PUT_LINE('found');
ELSE
DBMS_OUTPUT.PUT_LINE(TO_CHAR('not found'));
END IF;
END;
但它根本不打印任何东西,尽管数据库中存在具有该名称的记录
由于
答案 0 :(得分:4)
通常,你会做类似
的事情DECLARE
l_count PLS_INTEGER;
BEGIN
SELECT COUNT(*)
INTO l_count
FROM employee
WHERE name = 'chuck'
AND rownum = 1;
IF( l_count = 1 )
THEN
dbms_output.put_line( 'found' );
ELSE
dbms_output.put_line( 'not found' );
END IF;
END;
如果您确实想使用显式游标,则需要检查<<cursor_name>>%rowcount
,而不是sql%rowcount
以确定已提取的行数。如果您要使用显式游标,还需要注意关闭游标。由于您没有发布表定义或您正在使用的数据,我将使用EMP
模式中的SCOTT
表作为示例
SQL> ed
Wrote file afiedt.buf
1 DECLARE
2 v_emp emp%ROWTYPE;
3 CURSOR c_emp IS
4 SELECT * FROM emp WHERE ename='SMITH';
5 BEGIN
6 OPEN c_emp;
7 FETCH c_emp INTO v_emp;
8 IF c_emp%ROWCOUNT=1 THEN
9 DBMS_OUTPUT.PUT_LINE('found');
10 ELSE
11 DBMS_OUTPUT.PUT_LINE(TO_CHAR('not found'));
12 END IF;
13 CLOSE c_emp;
14* END;
SQL> /
found
PL/SQL procedure successfully completed.
请注意,无论您使用何种方法,如果您希望显示DBMS_OUTPUT
的输出,您需要在您使用的任何工具中启用输出。如果您使用的是SQL * Plus,则意味着运行
SQL> set serveroutput on;
在执行匿名PL / SQL块之前。
答案 1 :(得分:0)
没有SQL%ROWCOUNT
和局部变量的解决方案:
begin
for entry in ( select case when count(*) = 0 then 'found'
else 'not found'
end as is_found_txt
from dual
where exists(select null
from employee
where name = 'chuck'))
loop
dbms_output.put_line( entry.is_found_txt );
end loop;
end;