Java 用复杂的输入和输出调用存储过程的JDBC程序

Java 用复杂的输入和输出调用存储过程的JDBC程序,java,jdbc,Java,Jdbc,您能帮我编写JDBC程序来调用下面的存储过程吗?它具有复杂的输入类型 下面是我的存储过程定义 CREATE OR REPLACE TYPE inputObjects_t AS OBJECT ( serviceID VARCHAR2(7), offerID VARCHAR2(7), transactionID NUMBER ) CREATE OR REPLACE TYPE inputArray_t IS VARRAY(100) OF

您能帮我编写JDBC程序来调用下面的存储过程吗?它具有复杂的输入类型

下面是我的存储过程定义

CREATE OR REPLACE TYPE inputObjects_t AS OBJECT (
    serviceID        VARCHAR2(7),
    offerID          VARCHAR2(7),
    transactionID    NUMBER
)

CREATE OR REPLACE TYPE inputArray_t IS VARRAY(100) OF inputObjects_t

PROCEDURE CheckObjectInput( pCustomerRef IN VARCHAR2,
                                 pSubscriptionPS IN NUMBER,
                                 pExpiryObjects IN inputArray_t,
                                 pTransactionDtm IN DATE,
                                 pTransactionID IN NUMBER);

PROCEDURE CheckObjectOutput( pCustomerRef IN VARCHAR2,
                                 pSubscriptionPS IN NUMBER,
                                 pExpiryObjects OUT inputArray_t,
                                 pTransactionDtm IN DATE,
                                 pTransactionID IN NUMBER);

您需要一个池来存储数据库连接,然后是调用存储的进程的方法。您可能需要以下内容:

public callStoredProc(String serviceID, String offerID, Integer trasnactionID) {
   try {
   myConnection.startTransaction();
   StringBuilder mySQL = new StringBuilder();
   ... build sql statement ...
   myConnection.execute(mySQL.toString());
   } catch (SQLException sqle) {
   ...
   } finally {
      myConnection.endTransaction();
      ... sql cleanup ...
   }
}

如果您使用Oracle,请使用类
OracleCallableStatement

有一种方法叫做
setSTRUCT

一般示例:

OracleConnection conn = (...)
OracleCallableStatement cs = (OracleCallableStatement) conn.prepareCall(sql);
StructDescriptor sd = StructDescriptor.createDescriptor("MY_TYPENAME", conn);
Object[] attribs = new Datum[3];
attribs[0] = new CHAR("value1",  charSet);
attribs[1] = new CHAR("value2",  charSet);
CLOB clob2 = attribs[2] = new CLOB(conn);
STRUCT st = new STRUCT(sd, conn, attribs);
(...)
cs.setSTRUCT(n, st);
(...)
cs.execute()

您可能需要提及存储过程运行的数据库。JDBC进程基本相同,连接到数据库,处理SQL,提交,断开与数据库的连接。Michael&Gilbert我不明白,请您提供更多详细信息。您需要管理数据库连接,以便创建一个池(此答案中未显示)。对于冗长的sql存储过程,如果希望在事务失败时启动事务,请形成sql请求并执行它。由于SQL连接可能会失败,数据库可能会抛出错误,因此需要一系列catch语句,然后是finally语句来清理连接。在我的例子中,存储的进程只能运行一次,所以我将调用包装在一个信号量中,以确保它不会被调用两次。