2012-11-30 35 views
2

我想使用函數SQL%ROWCOUNT來告訴我一個記錄是否在表中。 是我的代碼如下:rowcount in Oracle

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

通常情況下,你會不會打印任何東西沉綿該記錄這樣做

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,沒有t 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,則意味着在執行匿名PL/SQL塊之前運行

SQL> set serveroutput on; 

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;