【问题标题】:Issue when calling a PLSQL function in select query when function returns an nested table当函数返回嵌套表时,在选择查询中调用 PLSQL 函数时出现问题
【发布时间】:2017-02-08 02:01:24
【问题描述】:

我有一个 plsql 函数,我在选择查询中调用它,如下所示:

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,它可以返回多个结果或数字

现在,当我执行查询时,我得到的列值输出为:

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.

我可以在我的初始选择查询中执行哪些操作以使值变为可使用的?如果我将选择查询返回的值写入某个数据类型为 int 的临时表并从那里使用,也可以。 我正在使用 oracle 11g。 非常感谢任何帮助。欢迎任何指导。 PS:我无法更改功能。

【问题讨论】:

  • 声明'type test_type is table of number' - 不是关联数组,即嵌套表
  • 是的,你是对的,我犯了一个错误
  • “消耗品”是什么意思?耗材怎么样? SELECT TEST_PKG.GET_VAL(db_id)... 是合法的语法,即使 GET_VAL 返回一个表类型。
  • 也许您正在寻找这个:SELECT CURSOR(SELECT * FROM TABLE(test_pkg.get_val(db.id))) FROM test_table db WHERE...?这将返回每个 test_table 记录的值列表作为游标而不是表类型。
  • @MatthewMcPeak 我的意思是很容易从 java 访问到消费。

标签: mysql oracle select stored-procedures plsql


【解决方案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 中使用结果,第二个选项(“作为游标”)效果很好。您可以选择CURSOR 列作为Object,然后将其转换为ResultSet 以迭代并获取内容。

【讨论】:

    【解决方案2】:

    如果您无法修改 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;
    /
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多