2016-02-04 84 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;