我有以下类型:
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;
和
CREATE OR REPLACE TYPE num_tab AS TABLE OF num_t
我的包定义如下:
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;
当我尝试编译时,我收到以下错误:
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));
它看起来应该对我有用。有什么想法吗?
答案 0 :(得分:4)
这是正常的和预期的。 SQL中使用的函数只能引用SQL数据类型(例如,如果你有一个布尔数据类型,你会收到错误。)
您可以将其隐藏在包中:
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;
/
我也调整了
v_results num_tab := num_tab();
和
for 1..i_test.count loop
as first..last在空白数组的情况下会失败(数字错误)
例如,有一些数据:
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>