在PL / SQL VARRAY中使用ROWTYPE会产生编译错误

时间:2013-06-15 14:53:36

标签: sql oracle plsql oracle10g

如果我尝试下面的代码,那么它可以正常工作:

declare
type v_varray is varray(50) of emp%rowtype;
v_emp_details v_varray;
begin
select * bulk collect into v_emp_details from emp where dept_id = 1;
for i in 1 .. v_emp_details.count
loop
    dbms_output.put_line('Emp Name : ' || v_emp_details(i).emp_name);
end loop;
end;

但是如果我尝试将VARRAY创建为这样的数据库对象:

create or replace type xyz is varray(20) of emp%ROWTYPE

为什么会出现编译错误?

2 个答案:

答案 0 :(得分:8)

CREATE OR REPLACE TYPE v_varray IS VARRAY(50) OF employees%ROWTYPE;
-- Error(1,32): PLS-00329: schema-level type has illegal reference to HR.EMPLOYEES

不允许使用ROWTYPE,因为ROWTYPE是PL / SQL结构,在SQL create type语句中无法识别。

如果你想分享一种类型,你可以这样做:

CREATE OR REPLACE PACKAGE udt_types_pkg
AS
    TYPE v_varray IS VARRAY(50) OF employees%ROWTYPE;
END udt_types_pkg;
-- PACKAGE UDT_TYPES_PKG compiled

CREATE OR REPLACE PACKAGE working_pkg
AS
    l_varray  udt_types_pkg.v_varray;
END working_pkg;
-- PACKAGE WORKING_PKG compiled

答案 1 :(得分:0)

这必须像我想的那样

create or replace type xyz as varray(20) of varchar2(50)

Varray Tutorial