[英]Passing an associative array to a function within an procedure throws PLS-00382 expression is of wrong type
I have the following types: 我有以下几种类型:
CREATE OR REPLACE TYPE num_t AS OBJECT
(
c1 number,
MAP MEMBER FUNCTION sort_key RETURN VARCHAR2
)
CREATE OR REPLACE TYPE BODY num_t AS
MAP MEMBER FUNCTION sort_key RETURN VARCHAR2 IS
BEGIN
RETURN c1;
END;
END;
and 和
CREATE OR REPLACE TYPE num_tab AS TABLE OF num_t
My package is defined as follows: 我的包裹定义如下:
create or replace package test_package is
type t_test is table of number index by binary_integer;
test_empty_array t_test;
procedure test_proc(cur_out out sys_refcursor);
function test_fn(i_test in t_test) return num_tab;
end test_package;
create or replace package body test_package is
procedure test_proc(cur_out out sys_refcursor) is
i_test t_test := test_empty_array;
begin
open cur_out for
select * from table(test_fn(i_test));
end;
function test_fn(i_test in t_test) return num_tab is
v_results num_tab;
begin
for i in i_test.first .. i_test.last loop
v_results.extend;
v_results(i) := num_t(c1 => i_test(i));
end loop;
return v_results;
end;
end test_package;
When I try to compile this, I get the following errors: 当我尝试对此进行编译时,出现以下错误:
Error: PLS-00382: expression is of wrong type
Line: 7
Text: select * from table(test_fn(i_test));
Error: PLS-00306: wrong number or types of arguments in call to 'TEST_FN'
Line: 7
Text: select * from table(test_fn(i_test));
Error: PL/SQL: ORA-00904: "TEST_PACKAGE"."TEST_FN": invalid identifier
Line: 7
Text: select * from table(test_fn(i_test));
Error: PL/SQL: SQL Statement ignored
Line: 7
Text: select * from table(test_fn(i_test));
It looks like it should work to me. 看来它应该对我有用。 Any ideas? 有任何想法吗?
this is normal and expected. 这是正常且预期的。 functions used in SQL can only reference SQL datatypes (eg you'd get an error if you had a boolean datatype too). SQL中使用的函数只能引用SQL数据类型(例如,如果您也具有布尔数据类型,则会出错)。
you can hide it in the package: 您可以将其隐藏在包装中:
create or replace package test_package is
type t_test is table of number index by binary_integer;
test_empty_array t_test;
procedure test_proc(cur_out out sys_refcursor);
function test_fn(i_test in t_test) return num_tab;
end test_package;
/
create or replace package body test_package is
procedure test_proc(cur_out out sys_refcursor) is
i_test t_test := test_empty_array;
t_num num_tab;
begin
t_num := test_fn(i_test);
open cur_out for
select * from table(t_num);
end;
function test_fn(i_test in t_test) return num_tab is
v_results num_tab := num_tab();
begin
for i in 1..i_test.count loop
v_results.extend;
v_results(i) := num_t(c1 => i_test(i));
end loop;
return v_results;
end;
end test_package;
/
i also tweaked 我也调整了
v_results num_tab := num_tab();
and 和
for 1..i_test.count loop
as first..last would fail in the case of a blank array (numeric error) 作为first..last将在空白数组的情况下失败(数字错误)
eg with some data: 例如带有一些数据:
SQL> create or replace package body test_package is
2
3 procedure test_proc(cur_out out sys_refcursor) is
4 i_test t_test;
5 t_num num_tab;
6 begin
7 i_test(1) := 1;
8 i_test(2) := 3;
9 t_num := test_fn(i_test);
10 open cur_out for
11 select * from table(t_num);
12
13 end;
14
15 function test_fn(i_test in t_test) return num_tab is
16 v_results num_tab := num_tab();
17 begin
18 for i in 1..i_test.count loop
19 v_results.extend;
20 v_results(i) := num_t(c1 => i_test(i));
21 end loop;
22
23 return v_results;
24 end;
25
26 end test_package;
27 /
Package body created.
SQL> exec test_package.test_proc(:c)
PL/SQL procedure successfully completed.
SQL> print c
C1
----------
1
3
SQL>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.