JDBC调用ORACLE的存储过程(带自定义Type 类型的in和out)实测可用
因为业务需求,需要去调用ORACLE的存储过程,但是存储过程里面含有IN/OUT的参数类型是自定义类型,因此琢磨很久。然后在百度和谷歌找不到相关的解决方案,或者说找不到能过直接粘贴复制的代码,只能自己找相关的资料去自己搞。下面代码是JDBC的方式去调通的(背景说明白了,下面直接贴代码吧)
数据库方面:
存储过程自定义类型:
TYPE "T_OBJ_PREF" as object (
TYPE_ID VARCHAR2(100),
SEQUENCE_ID VARCHAR2(100),
NAME_ID VARCHAR2(300),
VALUE_ID VARCHAR2(300)
);
TYPE "PREF_DTL_TBL" AS TABLE OF T_OBJ_PREF;
存储过程:
CREATE OR REPLACE PACKAGE body TIBCODB.PKG_LOY_PROFILE_UPDATE
AS
PROCEDURE SP_LOY_CUST_UPD(
I_IN IN PREF_DTL_TBL,
I_OUT OUT PREF_DTL_TBL,
I_INOUT INOUT PREF_DTL_TBL
)
## 下面是存储过程的内容,这里不贴了,只要关注上面的 IN OUT INOUT
........
编程方面:
实体类:
package com.michaels.tibcoapi.orcl.entity;
import com.alibaba.fastjson.JSONObject;
import lombok.Data;
import org.springframework.stereotype.Component;
import java.io.Serializable;
import java.sql.SQLData;
import java.sql.SQLException;
import java.sql.SQLInput;
import java.sql.SQLOutput;
@Data
@Component
public class PrefDtlTbl implements SQLData,Serializable {
// 这里贴TIBCODB.PREF_DTL_TBL是因为存储过程直接调用这个
public static final String SQL_TYPE = "TIBCODB.PREF_DTL_TBL";
private String TYPE_ID;
private String SEQUENCE_ID;
private String NAME_ID;
private String VALUE_ID;
@Override
public String getSQLTypeName() throws SQLException {
return SQL_TYPE;
}
public PrefDtlTbl() {
}
public PrefDtlTbl(String TYPE_ID, String SEQUENCE_ID, String NAME_ID, String