Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.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 如何通过jdbc发送和接收Oracle集合_Java_Oracle_Ojdbc - Fatal编程技术网

Java 如何通过jdbc发送和接收Oracle集合

Java 如何通过jdbc发送和接收Oracle集合,java,oracle,ojdbc,Java,Oracle,Ojdbc,我试图调用一个存储过程,它接收多个字符串类型和一个对象表,并返回一个对象表。以下是我的类型: create type recipientlist as object ( precedence varchar2(2), name varchar2(128), msgType varchar2(3)); create type recipientlist_t as TABLE of recipientlist; create type recipientclient as object (

我试图调用一个存储过程,它接收多个字符串类型和一个对象表,并返回一个对象表。以下是我的类型:

create type recipientlist as object (
    precedence varchar2(2), name varchar2(128), msgType varchar2(3));
create type recipientlist_t as TABLE of recipientlist;
create type recipientclient  as object (pla varchar2(128), client varchar2(20));
create type recipientclientlist_t as table of recipientclient;
这是我的密码:

import java.util.ArrayList;
import java.sql.Array;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.SQLException;
import java.sql.Types;

import oracle.jdbc.*;
import oracle.jdbc.oracore.OracleTypeCOLLECTION;
import oracle.jdbc.pool.OracleDataSource;
import oracle.sql.ARRAY;
import oracle.sql.ArrayDescriptor;



class OadUtilities {

    public static void main(String[] args) throws SQLException{

         OracleDataSource ods = new OracleDataSource();
         ods.setURL("jdbc:oracle:thin:username/password@localhost:1521/myservicename");

         Connection conn = ods.getConnection();
         CallableStatement proc =
         conn.prepareCall("{call extractAttributes(?,?,?,?,?,?)}");

         ArrayDescriptor arrDesc1 =
                    ArrayDescriptor.createDescriptor("RECIPIENTLIST_T", conn);
         <del>ArrayDescriptor arrDesc2 =
                    ArrayDescriptor.createDescriptor("RECIPIENTCLIENTLIST_T", conn);</del>
         // instead of the ArrayDescriptor I use a StructDescriptor with ResultSetMetaData
         StructDescriptor structDesc =
        StructDescriptor.createDescriptor("RECIPIENTCLIENT", conn);
     ResultSetMetaData metaData = structDesc.getMetaData();

         String[] myRecipientData = {"TO","ADDRESS","LETTER"};
         String[][] myRecipientDataArray = { myRecipientData };
         Array myRecipientList = new ARRAY(arrDesc1, conn, myRecipientDataArray);

         <del>String[] myClientData = new String[2];
         String[][] myClientDataArray = { myClientData };
         Array myClientList = new ARRAY(arrDesc2, conn, myClientDataArray);</del>

         proc.setString(1, "X");
         proc.setString(2, "ABC DEF GHI");
         proc.setString(3, "JK LM NO");
         proc.setString(4, "PQ");
         proc.setArray(5, myRecipientList);
         proc.registerOutParameter(6, Types.ARRAY);
         <del>proc.setArray(6, myClientList);</del>
         proc.registerOutParameter(6, Types.ARRAY, "RECIPIENTCLIENTLIST_T");

         ResultSet rset = proc.executeQuery();

         <del>while (rset.next()) {
             System.out.println("ADDRESSEE = " + rset.getArray(1));
             System.out.println("CLIENT = " + rset.getArray(2));
         } </del>

     // elements are java.sql.Structs
     Object[] data = (Object[]) ((Array) proc.getObject(6)).getArray();
     for(Object tmp : data) {
         Struct row = (Struct) tmp;
     // Attributes are index 1 based...
     int idx = 1;
     for(Object attribute : row.getAttributes()) {              
         System.out.println(metaData.getColumnName(idx) + " = " + attribute);
         ++idx;
     }
     System.out.println("---");      

      }

             // close the result set, the statement and connect
             rset.close();
             conn.close();

    }

}
我怀疑数组描述符有些地方不太正确,但它们都构建正确,所以可能是我为返回传递的空数组?还没有在谷歌上找到任何显示复杂收藏的东西,所以我不知所措


更新:在我在下面提到的网站上查看了代码后,我写了这个,它工作得很好。

extractAttributes
的第六个参数,是
输入输出
参数还是仅仅
输出
?如果只是
OUT
,那么就不要为第6位调用
setArray
。可能的重复可能的重复我在这个网站上找到了我的大部分答案:它给了我大部分答案,其余的我都能找到。我把新代码和原来的帖子一起放在盒子里。
Exception in thread "main" java.sql.SQLException: ORA-03115: unsupported network datatype or    representation

at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:439)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:395)
at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:802)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:436)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:186)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:521)
at oracle.jdbc.driver.T4CCallableStatement.doOall8(T4CCallableStatement.java:202)
at oracle.jdbc.driver.T4CCallableStatement.executeForRows(T4CCallableStatement.java:1005)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1307)
at       oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3449)
at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3493)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1491)
at oadUtilities.OadUtilities.main(OadUtilities.java:50)