Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在PL/SQL存储过程中返回自定义集_Java_Oracle_Stored Procedures_Plsql_Oracle11g - Fatal编程技术网

Java 如何在PL/SQL存储过程中返回自定义集

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,

如何从PL/SQL返回一组数据

我有一个存储过程,需要运行select语句并将结果返回给调用(Java)程序

select语句包含来自多个表的几个连接,因此我不确定如何在存储过程定义或主体中定义这种类型

我在想,也许这可以按如下方式完成,但SQL Developer给了我错误:

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游标。