当函数返回嵌套表时,在select查询中调用PLSQL函数时出现问题

时间:2016-09-29 16:24:24

标签: mysql oracle select stored-procedures plsql

我有一个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:我无法更改功能。

2 个答案:

答案 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;
/