Oracle10g Oracle中的行计数
我想使用函数SQL%ROWCOUNT告诉我记录是否在表中。 我拥有的代码如下:Oracle10g Oracle中的行计数,oracle10g,rowcount,Oracle10g,Rowcount,我想使用函数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');
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;
但它根本不打印任何内容,即使数据库中存在具有该名称的记录
谢谢通常情况下,您会这样做
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;
如果确实要使用显式游标,则需要检查%rowcount
,而不是sql%rowcount
,以确定提取了多少行。如果要使用显式游标,还需要注意关闭游标。由于您没有发布表定义或正在使用的数据,因此我将使用SCOTT
模式中的EMP
表作为示例
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\u output
的输出,则需要在使用的任何工具中启用输出。如果您使用的是SQL*Plus,那就意味着运行
SQL> set serveroutput on;
在执行匿名PL/SQL块之前。通常,您需要执行以下操作
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;
如果确实要使用显式游标,则需要检查%rowcount
,而不是sql%rowcount
,以确定提取了多少行。如果要使用显式游标,还需要注意关闭游标。由于您没有发布表定义或正在使用的数据,因此我将使用SCOTT
模式中的EMP
表作为示例
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\u output
的输出,则需要在使用的任何工具中启用输出。如果您使用的是SQL*Plus,那就意味着运行
SQL> set serveroutput on;
在执行匿名PL/SQL块之前。不带
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;
不带
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;