如何打印光标记录?

问题描述

我试图打印光标记录,但是不能。下面的代码,我已经尝试过。

DECLARE
   CURSOR CUR_EMP IS
      SELECT *
        FROM EMP
       WHERE Deptno = &DNO;

   V_REC  CUR_EMP%rOWTYPE;
BEGIN
   OPEN CUR_EMP;

   LOOP
      FETCH CUR_EMP INTO V_REC;

      EXIT WHEN CUR_EMP%NOTFOUND;
      DBMS_OUTPUT.PUT_LINE (
            'Record No:'
         || CUR_EMP%rOWCOUNT
         || ' '
         || V_REC.ENAME
         || ' 
                         '
         || V_REC.SAL);
   END LOOP;

   CLOSE CUR_EMP;
END;

解决方法

如果您像以前那样运行它:

SQL> declare
  2    cursor cur_emp is select * from emp
  3      where deptno = &dno;
  4    v_rec  cur_emp%rowtype;
  5  begin
  6    open cur_emp;
  7    loop
  8      fetch cur_emp into v_rec;
  9      exit when cur_emp%notfound;
 10
 11      dbms_output.put_line('Record no: ' || cur_emp%rowcount ||' '|| v_rec.ename);
 12    end loop;
 13    close cur_emp;
 14  end;
 15  /
Enter value for dno: 10
old   3:     where deptno = &dno;
new   3:     where deptno = 10;

PL/SQL procedure successfully completed.            --> there's no output

但是,如果您启用输出...

SQL> set serveroutput on
SQL>

...然后再次运行该代码:

SQL> /
Enter value for dno: 10
old   3:     where deptno = &dno;
new   3:     where deptno = 10;
Record no: 1 CLARK                             --> oh yes,here they are!
Record no: 2 KING
Record no: 3 MILLER

PL/SQL procedure successfully completed.

SQL>

因此,在SQL * Plus(或SQL Developer,甚至可能有更多支持它的工具)中使用set serveroutput on,或在您的GUI中启用它。因为,该代码应该正确运行(当然,如果满足WHERE条件)。


另外,请考虑使用游标FOR循环,因为Oracle执行大部分 dirty 作业(声明游标变量,打开游标,注意退出循环,关闭)很容易维护光标):

SQL> begin
  2    for cur_emp in (select rownum rn,e.* from emp e where deptno = &dno) loop
  3      dbms_output.put_line('Record no: ' || cur_emp.rn ||' '|| cur_emp.ename);
  4    end loop;
  5  end;
  6  /
Enter value for dno: 10
old   2:   for cur_emp in (select rownum rn,e.* from emp e where deptno = &dno) loop
new   2:   for cur_emp in (select rownum rn,e.* from emp e where deptno = 10) loop
Record no: 1 CLARK
Record no: 2 KING
Record no: 3 MILLER

PL/SQL procedure successfully completed.

SQL>