在 PL/SQL VARRAY 中使用 ROWTYPE 会产生编译错误
Posted
技术标签:
【中文标题】在 PL/SQL VARRAY 中使用 ROWTYPE 会产生编译错误【英文标题】:Using ROWTYPE in PL/SQL VARRAY giving compilation errors 【发布时间】:2013-06-15 14:53:36 【问题描述】:如果我尝试下面的代码,那么它工作正常:
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
为什么会出现编译错误?
【问题讨论】:
【参考方案1】: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 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
【讨论】:
【参考方案2】:我觉得应该是这样的
create or replace type xyz as varray(20) of varchar2(50)
Varray Tutorial
【讨论】:
以上是关于在 PL/SQL VARRAY 中使用 ROWTYPE 会产生编译错误的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 PL/SQL 中的 VARRAY 函数中的变量传递字符串值
Oracle:PL/SQL 中查看值是不是存在的最快方法:列表、VARRAY 或临时表
Oracle PL/SQL:如何从 VARRAY 的 REF 中进行 DEREF?