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;

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

谢谢

4

2 回答 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确定已获取多少行。如果要使用显式游标,还需要注意关闭游标。由于您没有发布表定义或您正在使用的数据,我将使用架构中的EMPSCOTT作为示例

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 块之前。

于 2012-11-30T21:15:14.580 回答
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;
于 2013-06-21T08:34:45.333 回答