【问题标题】:PL/SQL Cursor just check if value is greater than a valuePL/SQL 游标只检查值是否大于一个值
【发布时间】:2021-11-02 06:25:24
【问题描述】:

我想要 从表employees 中检查是否存在empno emno 大于 100。如果至少存在一个,我想要 退出循环。

如何修改以下代码? 是我不使用 %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;

【问题讨论】:

  • 您能否提供更多问题的详细信息?在这个公式中,您只需在 SQL*Plus 中执行单个 sql 查询(没有 PL/SQL)select * from emp where empno > 100

标签: plsql


【解决方案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;
/

编辑:如果您想获取具有某些条件的行,您只需在您的SELECT 语句中调整您的WHERE 子句。这里有一个示例,其中包含一些迭代获取的记录的方法:

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;
/

【讨论】:

  • 感谢您的回答。我想要这些行中的其他列,即 ename(稍后在过程中)。出于这个原因,我认为循环更好。但我不知道如何在语句打印消息时使用 exit 执行循环。
  • 嘿。给你一个获取所需行的小例子。
【解决方案2】:

在你找到你的价值后,只需添加一个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,代码永远不会知道光标没有数据,并且可能会进入无限循环。

【讨论】:

    【解决方案3】:

    为什么要定义游标然后打开并获取它可以通过just完成 SQL 但如果需要,则使用 FOR 循环和 EXIT 条件 如前所述

    在下面。希望对你有帮助

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-03
      • 2011-04-15
      • 1970-01-01
      • 2021-07-13
      • 1970-01-01
      • 2021-08-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多