2016-02-04 83 views
0

我是新手在PL/SQL。我想 做一個程序檢查是否存在empno從表僱員 與emno大於100.如果至少存在一個,我想要 退出循環。PL/SQL光標只是檢查值是否大於值

如何修改以下代碼? 是不是問題;不使用%NOTFOUND,%ROWCOUNT?

CREATE OR REPLACE procedure check_value 
IS 

cursor c1 is 
    select * 
    from employess; 

c1_values c1%ROWTYPE; 

BEGIN 

    open c1; 
    fetch c1 into c1_values; 
    loop 
     if c1_values.EMPNO > 100 then 
      DBMS_OUTPUT.put_line ('Found row with empno > 100'); 
     end if; 
    end loop; 
    close c1; 

END; 

在此先感謝您的幫助。

+0

能爲您提供問題的詳細資料?在這個公式中,你只需要執行一個SQL查詢(不包括PL/SQL)在SQL * Plus爲'從EMP選擇*其中EMPNO> 100' – Dmitry

回答

1

如果你只需要檢查是否有已EMPNO超過100個的紀錄,你可以使用例如EXISTS聲明

DECLARE 
    CURSOR c1 IS 
    SELECT 
     CASE 
      WHEN EXISTS (
       SELECT 
        1 
       FROM 
        employees 
       WHERE 
        empno > 100 
      ) THEN 1 
      ELSE 0 
     END AS empno_exists 
    FROM 
     dual; 

    ln_empno_exists  PLS_INTEGER; 

BEGIN 
    OPEN c1; 
    FETCH c1 INTO ln_empno_exists; 
    CLOSE c1; 

    DBMS_OUTPUT.PUT_LINE('Empno over 100 exists: '||CASE WHEN ln_empno_exists = 1 THEN 'TRUE' ELSE 'FALSE' END); 

END; 
/

編輯:如果你想用一些條件,以獲取行,你只需要調整您的WHERE子句中的SELECT聲明。這裏有一些方法,通過記錄提取到迭代的例子:

DECLARE 
    CURSOR c1 IS 
    SELECT 
     emp.* 
    FROM 
     employees emp 
    WHERE 
     empno > 100 
    ; 

    lr_c1_rec  c1%ROWTYPE; 
BEGIN 
    -- Using FOR loop 
    DBMS_OUTPUT.PUT_LINE('START: Printing employees records where empno > 100'); 
    FOR rec IN c1 
    LOOP 
     DBMS_OUTPUT.PUT_LINE('empno = '||rec.empno); 
    END LOOP; 
    DBMS_OUTPUT.PUT_LINE('END: Printing employees records where empno > 100'); 



    -- Using a LOOP with EXIT clause 
    DBMS_OUTPUT.PUT_LINE('START: Printing employees records where empno > 100'); 
    OPEN c1; 
    LOOP 
     FETCH c1 INTO lr_c1_rec; 
     -- exit the loop when your cursor doesn't have any more records to be returned 
     EXIT WHEN c1%NOTFOUND; 

     DBMS_OUTPUT.PUT_LINE('empno = '||lr_c1_rec.empno); 
    END LOOP; 
    DBMS_OUTPUT.PUT_LINE('END: Printing employees records where empno > 100'); 

    -- Using WHILE loop 
    DBMS_OUTPUT.PUT_LINE('START: Printing employees records where empno > 100'); 
    OPEN c1; 
    FETCH c1 INTO lr_c1_rec; 
    -- As long as cursor returns any values, iterate through the records returned 
    WHILE c1%FOUND 
    LOOP 
     DBMS_OUTPUT.PUT_LINE('empno = '||lr_c1_rec.empno); 
    END LOOP; 
    DBMS_OUTPUT.PUT_LINE('END: Printing employees records where empno > 100'); 
END; 
/
+0

謝謝您的回答。我想和這些行中的其他列即ename(稍後在過程中)。 因爲這個原因,我認爲一個循環更好。 但我不知道我該怎麼做循環使用時,報表打印的也是消息出口。 – user494766

+0

嘿。給你一個提取所需行的小例子。 – AndrewMcCoist

0

只需添加一個EXIT聲明你發現你的價值之後:

CREATE OR REPLACE procedure check_value IS 
    cursor c1 is 
    select * 
    from employess; 

    c1_values c1%ROWTYPE; 
BEGIN 
    open c1; 

    loop 
    fetch c1 into c1_values; 
    IF c1%NOTFOUND THEN EXIT; 

    if c1_values.EMPNO > 100 then 
     DBMS_OUTPUT.put_line ('Found row with empno > 100'); 
     EXIT; 
    end if; 
    end loop; 

    -- The EXIT statement will drop you out of the loop and leave you here 

    close c1; 
END; 

注意,我感動fetch內循環並添加了%NOTFOUND檢查。如果沒有%NOTFOUND,代碼永遠不會知道遊標已經沒有數據,並且可能會進入無限循環。

0

爲什麼定義光標然後打開並取出時,它可以通過只 SQL進行,但如果需要這樣的話使用FOR循環和退出條件 下面提到

。希望它可以幫助

CREATE OR REPLACE PROCEDURE check_value 
IS 
BEGIN 
    FOR I IN 
    (SELECT * FROM employess 
) 
    LOOP 
    IF I.EMPNO > 5 THEN 
     DBMS_OUTPUT.put_line ('Found row with empno > 100'); 
     EXIT; 
    END IF; 
    END LOOP; 
END;