I have a package that declares a record type:
create or replace package schema_1.package_a as
type r_user_type is record (
name varchar2(100),
email varchar2(100)
);
end;
How do I reference this record type from a package in a different schema in the same database? I have provided correct grants so that schema_2.package_b has EXECUTE privs to schema_1.package_a.
I have tried the following ways, and get a PLS-00206: %TYPE must be applied to a variable, column... error each time.
create or replace package body schema_2.package_b as
procedure display_user_info
is
-- attempt 1
r_user_info schema_1.package_a.r_user_type%type;
-- attempt 2
r_user_info schema_1.package_a.r_user_type%rowtype;
-- attempt 3
r_user_info_type schema_1.package_a.r_user_type%type;
r_user_info r_user_info_type%type;
begin
select *
into r_user_info
from table(table_expression...);
end;
end;
CodePudding user response:
%TYPE and %ROWTYPE are only used on a data object like a table or column or cursor to abstract it into a type. r_user_type is not a table/column, but a TYPE. So, when you reference r_user_type, you are already directly referring to a TYPE, and therefore it doesn't need the %TYPE or %ROWTYPE modifiers. Just remove them and you're good.
CodePudding user response:
You don't need %TYPE or %ROWTYPE, just use the type name:
create or replace package body schema_2.package_b as
procedure display_user_info
is
r_user_info schema_1.package_a.r_user_type;
begin
select *
into r_user_info
from table(table_expression...);
end;
end;
/
However, you also probably need a WHERE filter on the SELECT statement (or some other form of limiting rows such as FETCH FIRST ROW ONLY) otherwise, if the table expression contains more than one element then you will get an exception.
