java - 以数组为参数调用存储过程
问题描述
使用 Java 和 Spring Data,我需要从 Oracle 数据库中调用以下存储过程:
TYPE R_ID_INSC_TYPE IS RECORD(id_insc INSC_REGISTRE.ID%TYPE);
TYPE T_ID_INSC IS TABLE OF R_ID_INSC_TYPE INDEX BY BINARY_INTEGER;
PROCEDURE CHARGER_RECHERCHE
(
P_NO_DEMANDE IN NUMBER,
P_SEQ_DEM IN NUMBER,
P_ETAPE_RECH IN VARCHAR2,
P_ID_INSC_TAB IN T_ID_INSC
);
似乎给我带来麻烦的是这个存储过程中的最后一个参数,它是一个 id 列表。这是我在 Java 中的调用方式:
public void call(final Integer numeroDemande,
final Integer numeroSequenceDemande,
final EtapeRecherche etapeRecherche,
final Integer[] ids) {
new SimpleJdbcCall(this.jdbcTemplate)
.withSchemaName(this.schemaName)
.withProcedureName(this.procedureName)
.declareParameters(
new SqlParameter("P_NO_DEMANDE", Types.INTEGER),
new SqlParameter("P_SEQ_DEM", Types.INTEGER),
new SqlParameter("P_ETAPE_RECH", Types.VARCHAR),
new SqlParameter("P_ID_INSC_TAB", Types.ARRAY))
.execute(numeroDemande, numeroSequenceDemande, etapeRecherche.getValue(), ids);
}
这会引发以下错误:
org.springframework.jdbc.BadSqlGrammarException: CallableStatementCallback; bad SQL grammar [{call PLATEFORME.CHARGER_RECHERCHE()}];
nested exception is java.sql.SQLException: ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'CHARGER_RECHERCHE'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
存储过程的实现负责人还给了我们如下使用示例:
declare
P_ID_INSC_TAB PLATEFORME.T_ID_INSC;
P_NO_DEMANDE NUMBER:=317225;
P_SEQ_DEM NUMBER:=1;
P_ETAPE_RECH VARCHAR2(2):='AI';
begin
P_ID_INSC_TAB(1).id_insc:=1258773;
P_ID_INSC_TAB(2).id_insc:=1258774;
P_ID_INSC_TAB(3).id_insc:=1258775;
PLATEFORME.CHARGER_RECHERCHE(P_NO_DEMANDE,P_SEQ_DEM,P_ETAPE_RECH,P_ID_INSC_TAB);
end;
负责实现存储过程的人员还提议将定义更改为这个,如果它可以使它更容易的话:
TYPE T_ID_INSC IS TABLE OF NUMBER(9) INDEX BY BINARY_INTEGER;
PROCEDURE CHARGER_RECHERCHE
(
P_NO_DEMANDE IN NUMBER,
P_SEQ_DEM IN NUMBER,
P_ETAPE_RECH IN VARCHAR2,
P_ID_INSC_TAB IN T_ID_INSC
);
为了成功调用此存储过程,我需要做什么?
谢谢。
解决方案
T_ID_INSC 是 Oracle 类型。ids 不能是 java 整数数组。试试这个(conn 是 oracle 连接):
import java.sql.*;
import oracle.jdbc.*;
import oracle.sql.*;
ArrayDescriptor arrDesc = ArrayDescriptor.createDescriptor("T_ID_INSC", conn);
Integer[] data = {1258773, 1258774, 1258775};
Array ids = new ARRAY(arrDesc, conn, data);
或者尝试:
import java.sql.*;
import oracle.jdbc.*;
import oracle.sql.*;
Integer[] data = {1258773, 1258774, 1258775};
Array ids = ((OracleConnection)conn).createOracleArray("T_ID_INSC", data);
推荐阅读
- arrays - 在Golang中替换数组结构中的数据
- php - 检查面向对象编程中是否存在密钥
- django - 找不到 Django 静态文件 404
- java - 闭包示例的流程 | 爪哇 8
- typescript - 通用打字机工厂
- ios - 无法加载已创建的 pdf 文件
- python - 如何从 mininet miniedit 文件中提取 python 代码?
- git - git clone aa a very big repository from github using ssh failed. 致命:早期 EOF 远程端意外挂断 index-pack 失败
- javascript - 带有过滤器的 JavaScript if 语句将不起作用
- python - Anaconda Navigator 已自行移除