【问题标题】:PL/SQL OUT SYS_REFCURSOR on associative array关联数组上的 PL/SQL OUT SYS_REFCURSOR
【发布时间】:2021-03-06 01:08:56
【问题描述】:

我在一个过程中有一个关联数组:

create or replace PROCEDURE RET_STRING_TAB(o_cursor OUT SYS_REFCURSOR) IS

type type_ntz is record(type_id number, type_uname varchar(32), type_pwd varchar(16));

type ntz_array is table of type_ntz index by pls_Integer;

v_ntz_array ntz_array;

BEGIN 
Select id,uname,pwd BULK COLLECT INTO v_ntz_array FROM users;

如您所见,我想在该数组上输出一个 refcusor,以便在 Java 中进一步使用它。我试着做:

OPEN o_cursor FOR 
SELECT * FROM TABLE(v_ntz_array);

但它一直在说:

  • PL/SQL:忽略 SQL 语句
  • PL/SQL:无法访问非嵌套表项中的行
  • PLS:表达式类型错误

提前感谢您的帮助!

【问题讨论】:

    标签: sql oracle plsql cursor associative-array


    【解决方案1】:

    您的 TYPE 需要在过程之外创建,因此您的调用程序(即:java)可以访问它并知道它的组成:

    CREATE OR REPLACE TYPE type_ntz IS OBJECT(type_id number, type_uname varchar(32), type_pwd varchar(16));
    /
    

    然后:

    create or replace PROCEDURE RET_STRING_TAB(o_cursor OUT SYS_REFCURSOR) IS [...]
    

    更新

    我重新阅读了你的问题,对我来说,做你正在寻找的最简单的方法是:

    create or replace PROCEDURE RET_STRING_TAB(o_cursor OUT SYS_REFCURSOR) IS
    BEGIN 
        OPEN o_cursor FOR
        Select id,uname,pwd FROM users;
    END;
    /
    

    【讨论】:

    • 有效!另一个问题:“批量收集”正在抛出“没有足够的价值”。我使用正确吗?
    • 我已经更新了我的答案。我认为你不需要为你正在尝试做的事情创建一个 TYPE。
    猜你喜欢
    • 2019-10-11
    • 2017-07-30
    • 1970-01-01
    • 2014-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    相关资源
    最近更新 更多