我要做的是以下内容:
create or replace
package MyPackage
as
type string_list_t is table of varchar2(32767);
function GetPrimaryKeys ( p_table_name varchar2, p_owner varchar2 )
return string_list_t;
end MyPackage;
/
create or replace
package body MyPackage as
function GetPrimaryKeys ( p_table_name varchar2, p_owner varchar2 )
return string_list_t
is
pk_descr string_list_t;
begin
select cast( multiset (
select cols.column_name
from all_constraints cons, all_cons_columns cols
where cols.table_name = p_table_name
and cons.constraint_type = 'P'
and cons.constraint_name = cols.constraint_name
and cols.owner = p_owner
and cons.owner = p_owner
) as string_list_t) into pk_descr from dual; -- error refers to string_list_t
return pk_descr;
end;
end MyPackage;
但它没有编译:
错误(16,14):PL / SQL:ORA-00902:数据类型无效
当我将包外的string_list_t
定义为
create or replace
type string_list_t is table of varchar2(32767);
它编译并按预期工作。这里有什么区别,我如何使用包中定义的类型正确地做到这一点?
答案 0 :(得分:6)
如果要使用使用该类型的SQL select语句,则它必须是SQL类型。您不能将PL / SQL类型返回给SQL。
另一个可能有用的选项是创建一个for循环并填充数组。
CREATE OR REPLACE PACKAGE BODY MyPackage as
function GetPrimaryKeys ( p_table_name varchar2, p_owner varchar2 ) return string_list_t
is
pk_descr string_list_t;
--iCounter number:=1;
begin
/*------------------------------
- new version
------------------------------*/
SELECT cols.column_name
BULK COLLECT INTO pk_descr
FROM all_constraints cons,
all_cons_columns cols
WHERE cols.table_name = p_table_name
AND cons.constraint_type = 'P'
AND cons.constraint_name = cols.constraint_name
AND cols.owner = p_owner
AND cons.owner = p_owner;
/* old version */
FOR rec in (select cols.column_name
from all_constraints cons,
all_cons_columns cols
where cols.table_name = p_table_name
and cons.constraint_type = 'P'
and cons.constraint_name = cols.constraint_name
and cols.owner = p_owner
and cons.owner = p_owner)
LOOP
pk_descr(iCounter):= rec.column_name;
iCounter:= iCounter+1;
END LOOP;
RETURN pk_descr;
END;
END MyPackage;