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>
我正在尝试打印信用额度最高的前 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>