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明示カーソルを使用する場合は、カーソルを閉じるように注意する必要もあります。テーブル定義や使用しているデータを投稿しなかったので、例としてスキーマの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ブロックを実行する前。

于 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 に答える