gpt4 book ai didi

oracle - PL/SQL 包类型与模式类型

转载 作者:行者123 更新时间:2023-12-02 04:24:06 24 4
gpt4 key购买 nike

我想做的是:

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;

但它无法编译:

Error(16,14): PL/SQL: ORA-00902: invalid datatype

当我在包外部定义 string_list_t

create or replace
type string_list_t is table of varchar2(32767);

它按预期编译并工作。这里有什么区别以及如何使用包中定义的类型正确地做到这一点?

最佳答案

如果您要使用使用该类型的 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;

关于oracle - PL/SQL 包类型与模式类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6640941/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com