आप सादे SQL में पैकेज-स्तरीय प्रकारों का उपयोग करने का प्रयास कर रहे हैं, जिसकी अनुमति नहीं है। पैकेज में घोषित प्रकार पीएल/एसक्यूएल (या पीएल/एसक्यूएल के भीतर सादे एसक्यूएल स्टेटमेंट्स में भी) के लिए दृश्यमान या मान्य नहीं हैं। आप जो कर रहे हैं उसका एक कट-डाउन संस्करण:
create or replace package types as
type my_rec_type is record (dummy dual.dummy%type);
type my_table_type is table of my_rec_type index by binary_integer;
end types;
/
create or replace package p42 as
function get_table return types.my_table_type;
end p42;
/
create or replace package body p42 as
function get_table return types.my_table_type is
my_table types.my_table_type;
begin
select * bulk collect into my_table from dual;
return my_table;
end get_table;
end p42;
/
select * from table(p42.get_table);
SQL Error: ORA-00902: invalid datatype
पैकेज के भीतर भी, यदि आपके पास ऐसी प्रक्रिया है जो तालिका फ़ंक्शन का उपयोग करने का प्रयास करती है तो यह त्रुटि होगी। अगर आपने जोड़ा:
procedure test_proc is
begin
for r in (select * from table(get_table)) loop
null;
end loop;
end test_proc;
... पैकेज बॉडी संकलन ORA-22905: cannot access rows from a non-nested table item
।
आपको स्कीमा स्तर पर प्रकारों की घोषणा करने की आवश्यकता है, पैकेज में नहीं, इसलिए SQL create type
आदेश
:
create type my_obj_type is object (dummy varchar2(1));
/
create type my_table_type is table of my_obj_type;
/
create or replace package p42 as
function get_table return my_table_type;
end p42;
/
create or replace package body p42 as
function get_table return my_table_type is
my_table my_table_type;
begin
select my_obj_type(dummy) bulk collect into my_table from dual;
return my_table;
end get_table;
end p42;
/
select * from table(p42.get_table);
DUMMY
-----
X