我是学习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>