如何使用 pl/sql 光标在 oracle dbms 中打印所有员工'%rowtype'的详细信息?



这是我的代码,

declare
cursor c_emp is
select ename, sal, mgr from emp;
emp_detail emp%rowtype;
begin
open c_emp;
loop    
fetch c_emp into emp_detail;
exit when c_emp%NOTFOUND;
dbms_output.put_line(emp_detail);
end loop;
close c_emp;
end;
/

得到这个错误,

第8行出现错误:ORA-06550:第8行,第13列:PLS-00394:FETCH语句的INTO列表中的值数目错误ORA-06550:第8行,第13列:PL/SQL:SQL语句被忽略ORA-06550:第10行,第13列:PLS-00306:对"PUT_LINE"的调用中的参数数量或类型错误ORA-06550:第10行,第13列:PL/SQL:语句已忽略

对于这个错误,我浪费了很多时间,但最终我自己得到了答案,现在的问题是我为什么要发布这个,答案不希望其他人像我一样浪费时间,所以,

dbms_output_put_line打印字符串。emp_detail不是一个字符串,它是一个%ROWTYPE,你不能这样打印它。您可以从行类型中打印一列(或多列(。示例:

koen>set serveroutput on size 999999
koen>
1  declare
2    cursor c_emp is
3      select * from emp;
4    emp_detail emp%rowtype;
5  begin
6      open c_emp;
7          loop    
8              fetch c_emp into emp_detail;
9              exit when c_emp%NOTFOUND;
10              dbms_output.put_line(emp_detail.ename);
11          end loop;
12      close c_emp;
13* end;
/
KING
BLAKE
CLARK
JONES
SCOTT
FORD
SMITH
ALLEN
WARD
MARTIN
TURNER
ADAMS
JAMES
MILLER

现在您知道出了什么问题,为了节省一些时间&空格,切换到游标FOR循环,因为这样做-你不必声明游标变量,打开游标,注意退出循环,关闭游标-Oracle为你做了所有这些:

SQL> set serveroutput on
SQL> begin
2    for cur_r in (select ename, sal, mgr from emp) loop
3      dbms_output.put_line(cur_r.ename ||', '|| cur_r.sal ||', '|| cur_r.mgr);
4    end loop;
5  end;
6  /
SMITH, 800, 7902
ALLEN, 1600, 7698
WARD, 1250, 7698
JONES, 2975, 7839
MARTIN, 1250, 7698
BLAKE, 2850, 7839
CLARK, 2450, 7839
SCOTT, 3000, 7566
KING, 5000,
TURNER, 1500, 7698
ADAMS, 1100, 7788
JAMES, 950, 7698
FORD, 3000, 7566
MILLER, 1300, 7782
PL/SQL procedure successfully completed.
SQL>

相关内容

最新更新