获取对象表的游标时出错



我是学习PLSQL的新手,也是PLSQL中对象类型(抽象数据类型(的新手。所以不管怎样,我在我的公司看到一个代码在定义游标时使用了表运算符,所以我想试试这个。在下面的匿名块中,我得到一个错误"PLS-00386:在FETCH游标和INTO变量"V_CU"之间发现类型不匹配;但是当我在声明V_CU时使用c%rowtype(注释部分(而不是obj_emp时,我不会得到那个错误。我不明白这个错误的原因。

毕竟,一行光标c由对象obj_emp的单个元素组成,不是吗?

CREATE OR REPLACE TYPE obj_emp IS OBJECT (
first_name  VARCHAR2(80),
last_name   VARCHAR2(80),
salary      NUMBER
);
/
CREATE OR REPLACE TYPE tab_emp_t IS TABLE OF obj_emp;
/
declare
v_num number:=60;
tab_emp tab_emp_t :=tab_emp_t();
cursor c is select * from table(tab_emp);
v_cu obj_emp --c%rowtype
;

begin
for i in (select * from employees_copy where department_id = v_num) loop
tab_emp.extend;
tab_emp(tab_emp.last):=obj_emp(i.first_name, i.LAST_NAME, i.salary);
end loop;

open c;
loop
fetch c into v_cu;
exit when c%notfound;
dbms_output.put_line(v_cu.first_name||' '||v_cu.last_name||' earns '||v_cu.salary);
end loop;
close c;
end;
/

应为错误;如果取消对v_cu的数据类型的注释,那么它是固定的——它应该仍然是c%rowtype

但是,我认为您想要尝试的是显示存储在集合中的值。如果是这样的话,请查看以下代码(稍微修改了您所写的内容;我没有您的表,所以我使用了Scott的EMP(。

SQL> declare
2      v_num number:=10;
3      tab_emp tab_emp_t :=tab_emp_t();
4      v_cnt number:=1;
5      cursor c is select * from table(tab_emp);
6      v_cu c%rowtype; --obj_emp --c%rowtype
7
8  begin
9      dbms_output.put_line('-------- Store values into a collection ---------');
10      for i in (select * from emp where deptno = v_num) loop
11          tab_emp.extend;
12          tab_emp(v_cnt):=obj_emp(i.ename, i.job, i.sal);
13          v_cnt:=v_cnt+1;
14      end loop;
15      v_cnt:=1;
16
17      dbms_output.put_line('-------- Display values from a cursor -----------');
18      open c;
19      loop
20          fetch c into v_cu;
21          exit when c%notfound;
22          dbms_output.put_line(v_cu.first_name||' '||v_cu.last_name||' earns '||v_cu.salary);
23      end loop;
24
25      dbms_output.put_line('-------- Display values from a collection -------');
26
27      for i in tab_emp.first .. tab_emp.last loop
28        dbms_output.put_Line(tab_emp(i).first_name ||' '|| tab_emp(i).last_name ||' earns ' || tab_emp(i).salary);
29      end loop;
30  end;
31  /

中的结果

-------- Store values into a collection ---------
-------- Display values from a cursor -----------
CLARK MANAGER earns 2450
KING PRESIDENT earns 5000
MILLER CLERK earns 1300
-------- Display values from a collection -------
CLARK MANAGER earns 2450
KING PRESIDENT earns 5000
MILLER CLERK earns 1300
PL/SQL procedure successfully completed.
SQL>

最新更新