Oracle中的rowcount

时间:2012-11-30 21:07:37

标签: 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');
            ELSE
                     DBMS_OUTPUT.PUT_LINE(TO_CHAR('not found'));
        END IF;
END;

但它根本不打印任何东西,尽管数据库中存在具有该名称的记录

由于

2 个答案:

答案 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;