gpt4 book ai didi

oracle - 具有批量集合的表函数抛出无效数据类型

转载 作者:行者123 更新时间:2023-12-02 11:09:35 63 4
gpt4 key购买 nike

我正在编写一个函数,我想用表函数包装它,以便我可以与选择查询一起使用。

这是我的类型声明和我的函数的一些行

CREATE OR REPLACE PACKAGE TYPES 
AS
TYPE CURSORTYPE IS REF CURSOR;

TYPE vbugsrec
IS
RECORD (
bug_id bugs.bug_id%TYPE,
facility bugs.facility%TYPE
);

TYPE vbugstable
IS
TABLE OF vbugsrec
INDEX BY BINARY_INTEGER;

END;


/
CREATE OR REPLACE PACKAGE BODY CustomQueries
AS
FUNCTION pendverifylist (myldapid IN userpass.ldapalias%TYPE,
maxrows IN PLS_INTEGER:= CustomQueries.maxrecords)
RETURN types.vbugstable
IS
datarows types.vbugstable;
var_useralias userpass.ldapalias%TYPE
:= UPPER (pendverifylist.myldapid) ;

CURSOR pendverify_cur (
cursor_var_alias IN userpass.ldapalias%TYPE,
cursor_var_mybugstatus IN bugs.bug_status%TYPE,
cursor_var_wild IN qa_list.component%TYPE
)
IS
SELECT buglist.bug_id, buglist.facility
FROM bugs buglist,
(SELECT qa.product, qa.component
FROM qa_list qa, userpass UP
WHERE qa.qa_id = UP.userid
AND UP.ldapalias = cursor_var_alias) plist
WHERE buglist.bug_status = cursor_var_mybugstatus
AND buglist.smr_state IN (SELECT fs.finalstate
FROM finalstates fs)
AND buglist.facility = plist.product
AND (buglist.product LIKE plist.component
OR plist.component = cursor_var_wild);

BEGIN

OPEN pendverifylist.pendverify_cur (cursor_var_alias => pendverifylist.var_useralias,
cursor_var_mybugstatus => CustomQueries.default_bugstatus,
cursor_var_wild => CustomQueries.wildcard);

FETCH pendverifylist.pendverify_cur
BULK COLLECT INTO pendverifylist.datarows
LIMIT LEAST (GREATEST (0, pendverifylist.maxrows),
CustomQueries.MAXRECORDS);

CLOSE pendverifylist.pendverify_cur;

RETURN pendverifylist.datarows;

END pendverifylist;

END CustomQueries;
/

当我想使用如下所示的 TABLE 函数时,出现错误。ORA-00902:无效数据类型

SELECT * FROM TABLE(CUSTOMQUERIES.PENDVERIFYLIST ( 'product', 50 ));

任何人都可以帮我解决我在这里做错的事情吗?

提前致谢

最佳答案

您尝试在纯 SQL 中使用包级类型,这是不允许的。包中声明的类型对于 PL/SQL 外部(甚至在 PL/SQL 内的普通 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: 无法访问非嵌套表项中的行

您需要在架构级别声明类型,而不是在包中声明类型,因此使用 SQL create type command :

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

关于oracle - 具有批量集合的表函数抛出无效数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17033160/

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