簡體   English   中英

java - 在oracle存儲過程中傳遞數組

[英]java - passing array in oracle stored procedure

我有一個訪問 oracle 存儲過程的 Java 應用程序。 存儲過程的參數包括數組類型。 我這樣做如下...

con = this._getConnection();  
Connection narrowdConn = (Connection)WSJdbcUtil.getNativeConnection( (WSJdbcConnection)con );  

callable = con.prepareCall("{call MY_PKG.MY_PROCEDURE(?, ?)}");  


ArrayDescriptor arrayDescriptor = ArrayDescriptor.createDescriptor("VARCHAR2_ARR", narrowdConn);  
ARRAY arrayArg1 = new ARRAY(arrayDescriptor, con, docNames);  
ARRAY arrayArg2 = new ARRAY(arrayDescriptor, con, docTypes);  

callable.setArray(1, arrayArg1);  
callable.setArray(2, arrayArg2);  

callable.execute();  

現在,我得到了這個異常......

java.sql.SQLException: invalid name pattern: MY_PKG.VARCHAR2_ARR

VARCHAR2_ARR 是一個公共 TYPE,在 Oracle 包中定義,如下所示:

類型 VARCHAR2_ARR 是 VARCHAR2(50) 的表;

並在我的存儲過程中使用...

PROCEDURE MY_PROCEDURE  
    (V_ARR_ARG1  IN VARCHAR2_ARR,  
     V_ARR_ARG2  IN VARCHAR2_ARR)  

VARCHAR2_ARR類型是 PLSQL 類型,您將無法直接從 java 接口它。 我建議您在 AskTom 上查看有關類似問題的此線程

這里有幾個建議:

  • 創建一個可以從 java 綁定的 SQL TYPE
  • 從java插入臨時表並在plsql中讀取

在這兩種情況下,您都必須修改 PLSQL 過程或添加新的翻譯過程。

我們需要在創建數據源時設置 accessToUnderlyingConnectionAllowed falg true

我確實遇到了這個問題。 希望這個插圖可以幫助你:

在 oracle 中創建過程的步驟。

  • 創建所需對象的類型為:
CREATE OR REPLACE TYPE STUDENT_TYPE IS OBJECT
( ID NUMBER,
  NAME VARCHAR2(50));
  • 創建另一個數組對象:
CREATE OR REPLACE TYPE STUDENT_ARRAY IS TABLE OF STUDENT_TYPE;
  • 創建過程以接受對象數組並執行所需的操作,我在這里只是將表中的條目插入為:
CREATE OR REPLACE PROCEDURE SP_INSERT_STUDENT_RECORD_IN_BULK(
IN_STUDENT_RECORDS STUDENT_ARRAY) IS
BEGIN 
  FOR i IN IN_STUDENT_RECORDS.first.. IN_STUDENT_RECORDS.last
   LOOP
    BEGIN 
      INSERT INTO STUDENT(ID,NAME) VALUES
      (IN_STUDENT_RECORDS(i).ID, IN_STUDENT_RECORDS(i).NAME)
    END;
   END LOOP:
END SP_INSERT_STUDENT_RECORD_IN_BULK;

通過 Java 調用過程的代碼片段

import org.springframework.jdbc.core.*;
import oracle.jdbc.OracleConnection;
....
List<Student> students = getStudentList();
try(Connection hikariCon = dataSource.getConnection()){
    if(hikariCon.isWrapperFor(OracleConnection.class)){
        OracleConnection con = hikariCon.unwrap(OracleConnection.class);
        Object[] students = students.stream().map(student -> {
            return con.createStruct(STUDENT_TYPE, new Object[]{
                student.getId(),
                student.getName()
            });
        }).collect(Collectors.list()).flatMap(List::stream).toArray();
        
        SimpleJdbcCall jdbcCall = new SimpleJdbcCall(dataSource)
                                .withProcedureName("SP_INSERT_STUDENT_RECORD_IN_BULK")
                                .declareParameters(
                                new SqlParameter("IN_STUDENT_RECORDS", Types.ARRAY));
        jdbcCall.execute(con.createOracleArray(STUDENT_ARRAY,students))
    }
} catch(Exception e){
    log.error("Error due to- {}",e,getMessage());
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM