Oracle10g Oracle中的行计数

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');

我想使用函数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;
但它根本不打印任何内容,即使数据库中存在具有该名称的记录


谢谢

通常情况下,您会这样做

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;