我有一个plsql函数,我在我的select查询中调用了这样的函数:
select TEST_PKG.GET_VAL(db.id) as value from test_table db where (some condition lets say) db.id>11
plsql函数返回一个类型为number的嵌套表。
例如:type test_type is table of number
test_type是我的函数的返回类型,它是一个数字数组。对于一个id,它可以返回多个结果或数字
现在,当我执行查询时,我得到列值为output:
schema_name.functionname() i.e sa.GET_VAL() //if no record is found for an id
and sa.GET_VAL(21,33,11,33) //as output if function returns a value.
现在我如何才能获得价值21,33,11,33?如果我做
select * from table (TEST_PKG.GET_VAL(12334))// I get numbers in each row. this is consumable.
在初始选择查询中,我可以做些什么来使值变为耗材?如果我将select查询返回的值写入某个临时表,数据类型为int并从那里消耗,那也没问题。 我正在使用oracle 11g。 非常感谢任何帮助。欢迎任何指导。 P.S:我无法更改功能。
答案 0 :(得分:1)
在初始选择查询中,我可以做些什么来使值变为耗材?
返回表的SELECT
PL / SQL函数的几种方法:
TABLE OF NUMBER
... create type matt_tab_typ IS TABLE OF NUMBER;
create or replace function matt_tab_fnc ( p_id number ) RETURN matt_tab_typ IS
BEGIN
-- dummy logic
return new matt_tab_typ(21, 33, 11, 33);
END;
select o.object_id, matt_tab_fnc(object_id)
FROM all_objects o where rownum <= 10;
select o.object_id, cursor(SELECT * FROM TABLE(matt_tab_fnc(object_id)))
FROM all_objects o where rownum <= 10;
select o.object_id, t.column_value FROM all_objects o
CROSS JOIN LATERAL ( SELECT * FROM table(matt_tab_fnc(object_id))) t where rownum <= 10;
如果要在Java中使用结果,第二个选项(&#34;作为游标&#34;)运行良好。您可以选择CURSOR
列作为Object
,然后将其投放到ResultSet
进行迭代并获取内容。
答案 1 :(得分:0)
如果无法修改TEST_PKG.GET_VAL函数,则可以创建包装函数。这个包装器函数将返回一个pl / sql sys_refcursor,这对java来说不那么麻烦(查找有关如何从java访问sys_refcursor的文章)。
包装函数代码如下:
create or replace function fn_get_val_wrapper(v_id in number) return SYS_REFCURSOR as
v_ret_cur SYS_REFCURSOR;
begin
open v_ret_cur for
select tgv.column_value as val from table(test_pkg.get_val(v_id)) tgv;
return v_ret_val;
end;
/