3

以下のコードを試してみると、問題なく動作します。

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

これによりコンパイルエラーが発生するのはなぜですか?

4

2 に答える 2

10
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 は PL/SQL コンストラクトであり、SQL create type ステートメントでは認識されないため、ROWTYPE は使用できません。

タイプを共有したい場合は、次の方法で行うことができます。

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
于 2013-06-15T16:37:13.007 に答える