PL/SQL 包含 %ROWCOUNT 的块编译但不输出结果

PL/SQL block with %ROWCOUNT compiles but doesn't output result

我正在尝试打印信用额度最高的前 3 条记录。我的代码可以编译,但尽管有 SET SERVEROUTPUT ON SIZE 100000 但不打印任何内容,我对此感到有些困惑。 table 显示没有问题。另外,当我只有

EXIT WHEN high_credit%ROWCOUNT > 4;

脚本进入无限循环。

代码:

SET SERVEROUTPUT ON SIZE 1000000

DECLARE
   CURSOR high_credit IS
   SELECT first_name, last_name, employee_id, credit_limit FROM employees
      ORDER BY credit_limit DESC;   
   emp_fname employees.first_name%TYPE;
   emp_lname employees.last_name%TYPE;
   emp_empno employees.employee_id%TYPE;
   emp_crd_lmt employees.credit_limit%TYPE;
BEGIN
   DBMS_OUTPUT.PUT_LINE('First_Name ' || 'Last_Name ' || 'Employee_Id '
 || 'Credit_Limit');
   OPEN high_credit;
   LOOP
      FETCH high_credit INTO emp_fname, emp_lname, emp_empno, emp_crd_lmt;
      EXIT WHEN (high_credit%ROWCOUNT > 4) OR (high_credit%NOTFOUND);     
      DBMS_OUTPUT.PUT_LINE(emp_fname || ' ' || emp_lname || ' ' || emp_empno
 || ' ' || emp_crd_lmt);
   END LOOP;
   CLOSE high_credit;
END;

CREATE TABLE employees (
    employee_id NUMBER(3) NOT NULL,
    first_name VARCHAR2(8) NOT NULL,
    last_name VARCHAR2(15) NOT NULL,
    credit_limit NUMBER(4,2) NOT NULL,    
    CONSTRAINT employee_id_pk PRIMARY KEY (employee_id)    
);

INSERT INTO employees VALUES (201, 'Susan', 'Brown', 30);
INSERT INTO employees VALUES (202, 'Jim', 'Kern', 25);
INSERT INTO employees VALUES (203, 'Martha', 'Woods', 25);
INSERT INTO employees VALUES (204, 'Ellen', 'Owens', 15);
INSERT INTO employees VALUES (205, 'Henry', 'Perkins', 25);

代码在 COMMIT 之后工作;在 INSERT... 按照建议:

除了SQL%ROWCOUNT的无效使用(如OldProgrammer所说)(虽然,它不影响你的问题),看起来你

  • 创建了 table 并在 SQL Developer
  • 中插入了行
  • 没有没有提交
  • 在 SQL*Plus
  • 中执行了您的 PL/SQL 脚本
  • 由于未提交插入,SQL*Plus 会话看不到这些行(但它看到 table 因为 CREATE TABLE 是 DDL)

因此

  • COMMIT SQL 开发者
  • 然后 运行 您的代码 SQL*Plus

关于您在评论中提到的任务:看看这是否有帮助(我没有您的 table,所以我使用 Scott 的 EMP):

SQL> set serveroutput on;
SQL> declare
  2    cursor c1 is
  3      select * from emp
  4      order by sal desc;
  5    c1r c1%rowtype;
  6  begin
  7    open c1;
  8    loop
  9      fetch c1 into c1r;
 10      exit when c1%notfound or c1%rowcount > 3;
 11
 12      dbms_output.put_line(c1%rowcount ||': '|| c1r.ename ||': '|| c1r.sal);
 13    end loop;
 14    close c1;
 15  end;
 16  /
1: KING: 5001
2: FORD: 3000
3: SCOTT: 3000

PL/SQL procedure successfully completed.

SQL>