Oracle 中的行数

问题描述 投票:0回答:2

我想使用 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;

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

oracle10g rowcount
2个回答
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 块之前。


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;
© www.soinside.com 2019 - 2024. All rights reserved.