Java 如何在PL/SQL存储过程中返回自定义集
如何从PL/SQL返回一组数据 我有一个存储过程,需要运行select语句并将结果返回给调用(Java)程序 select语句包含来自多个表的几个连接,因此我不确定如何在存储过程定义或主体中定义这种类型 我在想,也许这可以按如下方式完成,但SQL Developer给了我错误:Java 如何在PL/SQL存储过程中返回自定义集,java,oracle,stored-procedures,plsql,oracle11g,Java,Oracle,Stored Procedures,Plsql,Oracle11g,如何从PL/SQL返回一组数据 我有一个存储过程,需要运行select语句并将结果返回给调用(Java)程序 select语句包含来自多个表的几个连接,因此我不确定如何在存储过程定义或主体中定义这种类型 我在想,也许这可以按如下方式完成,但SQL Developer给了我错误: CREATE OR REPLACE PACKAGE my_package AS TYPE a_collection_records IS RECORD ( NUMBER FIRST_COL,
CREATE OR REPLACE PACKAGE my_package
AS
TYPE a_collection_records IS RECORD (
NUMBER FIRST_COL,
VARCHAR2 SECOND_COL -- a few others
);
-- Procedure API that uses a_collection_records type
END;
CREATE OR REPLACE PROCEDURE sample_procedure(
p_some_select_sql_result OUT my_package.a_collection_records
)
AS
BEGIN
-- Populate p_some_select_sql_result with some select data
END;
您的类型定义有点不正常。在项目名称之前有类型定义
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,但如果您想要的名称不是所选表上的实际列名,那么您仍然可以选择记录类型
要将其创建为自定义集,只需在记录
定义结束后声明以下代码行
TYPE collection\u list是表a\u collection\u记录代码>
完整示例:
TYPE a_collection_records IS RECORD (
FIRST_COL NUMBER,
SECOND_COL VARCHAR2 -- a few others
);
TYPE collection_list IS TABLE OF a_collection_records;
这将为您提供一组自定义(和列屏蔽)数据。您的类型定义有点混乱。在项目名称之前有类型定义
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,但如果您想要的名称不是所选表上的实际列名,那么您仍然可以选择记录类型
要将其创建为自定义集,只需在记录
定义结束后声明以下代码行
TYPE collection\u list是表a\u collection\u记录代码>
完整示例:
TYPE a_collection_records IS RECORD (
FIRST_COL NUMBER,
SECOND_COL VARCHAR2 -- a few others
);
TYPE collection_list IS TABLE OF a_collection_records;
这将为您提供一组自定义(和列屏蔽)数据。除非您特别设置使用集合,否则使用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;
/
及
显然,您需要处理传递给实际过程/函数的任何其他参数。除非您特别设置了使用集合,否则使用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;
/
及
显然,您需要处理传递给实际过程/函数的任何其他参数。告诉我们您得到的错误会很有帮助。您是否承诺返回集合类型?a_collection_records
是一种记录类型,而不是集合类型,这可能有助于解释这些神秘的错误。但是通常你会返回一个ref游标,告诉我们你得到的错误会很有帮助。您是否承诺返回集合类型?a_collection_records
是一种记录类型,而不是集合类型,这可能有助于解释这些神秘的错误。但通常您会返回一个ref游标。