2012-01-12 107 views
0

您可以幫我編寫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 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); 
+0

您可能要提存儲過程運行的數據庫對。 JDBC進程幾乎相同,連接到數據庫,處理SQL,提交,從數據庫斷開連接。 – 2012-01-12 16:05:11

回答

0

你會希望有一個池您存儲的數據庫連接,然後方法調用存儲的特效。你可能想是這樣的:

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 ... 
    } 
} 
+0

邁克爾和吉爾伯特我不明白你能不能給我更多的細節。 – user1145770 2012-01-12 16:20:29

+0

您需要管理數據庫連接,以便創建一個池(此答案中未顯示)。對於冗長的SQL存儲過程,如果您希望在事務失敗的情況下啓動事務,請形成SQL請求並執行它。由於SQL連接可能會失敗,並且數據庫可能會拋出錯誤,因此需要一系列catch語句,然後使用finally語句清理連接。在我的情況下,存儲過程只能運行一次,所以我將這個調用包裝在一個信號量中,以確保它不被調用兩次。 – 2012-01-12 17:32:03

1

如果你使用Oracle,請使用類OracleCallableStatement
有一種方法叫做setSTRUCT

Generical例子:

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()