簡體   English   中英

帶有 %ROWCOUNT 的 PL/SQL 塊編譯但不輸出結果

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

我正在嘗試打印信用額度最高的前 3 條記錄。 我的代碼可以編譯,但盡管SET SERVEROUTPUT ON SIZE 100000沒有打印任何內容,我對此感到有些困惑。 該表顯示沒有問題。 另外,當我只有

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 之后工作; 在插入...如建議:

代碼正在運行

除了SQL%ROWCOUNT無效使用(如 OldProgrammer 所說)(雖然,它不會影響您的問題),看起來您

  • 在 SQL Developer 中創建表並插入行
  • 沒有
  • 在 SQL*Plus 中執行您的 PL/SQL 腳本
  • 由於未提交插入,SQL*Plus 會話看不到這些行(但它認為表是CREATE TABLE是 DDL)

所以

  • 在 SQL Developer 中COMMIT
  • 然后在 SQL*Plus 中運行您的代碼

關於您在評論中提到的任務:看看這是否有幫助(我沒有您的表格,所以我使用的是 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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM