2 回答
TA贡献1797条经验 获得超4个赞
除非您特别打算使用集合,否则使用ref游标会更简单:
CREATE OR REPLACE PROCEDURE sample_procedure (
p_some_select_sql_result OUT SYS_REFCURSOR
)
AS
BEGIN
OPEN p_some_select_sql_result FOR
SELECT ...
FROM ...
JOIN ...
... etc.;
END;
/
然后,您可以从JDBC中执行以下操作:
cStmt = conn.prepareCall('{ call sample_procedure(?) }');
cStmt.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);
cStmt.execute();
rSet = cStmt.getCursor(1);
然后您可以像访问其他任何对象一样遍历结果集。
您还可以使用一个函数代替:
CREATE OR REPLACE FUNCTION sample_function RETURN SYS_REFCURSOR
AS
l_some_select_sql_result
BEGIN
OPEN l_some_select_sql_result FOR
SELECT ...
FROM ...
JOIN ...
... etc.;
RETURN l_some_select_sql_result;
END;
/
和
cStmt = conn.prepareCall('{ ?=call sample_function }');
cStmt.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);
cStmt.execute();
rSet = cStmt.getCursor(1);
显然,您需要处理传递给实际过程/函数的任何其他参数。
TA贡献1963条经验 获得超6个赞
您的类型定义有点混乱。您必须在项目名称之前输入类型定义。
TYPE a_collection_records IS RECORD (
NUMBER FIRST_COL,
VARCHAR2 SECOND_COL -- a few others
);
它应该是
TYPE a_collection_records IS RECORD (
FIRST_COL NUMBER,
SECOND_COL VARCHAR2 -- a few others
);
列的名称位于列的数据类型之前。我希望这是您要寻找的。您总是可以做一个refcursor,但是如果您想要的名称不是您要从中选择的表上的实际列名,那么您仍然会选择哪种记录类型。
为了能够将其创建为自定义集,只需在RECORD定义关闭后声明以下代码行 TYPE collection_list IS TABLE a_collection_records;
完整的例子:
TYPE a_collection_records IS RECORD (
FIRST_COL NUMBER,
SECOND_COL VARCHAR2 -- a few others
);
TYPE collection_list IS TABLE OF a_collection_records;
这将为您提供一组自定义(和列掩码)的数据。
添加回答
举报