java - 使用数组作为参数调用存储过程

标签 java oracle stored-procedures spring-data

使用 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);

关于java - 使用数组作为参数调用存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51105835/

相关文章:

JavaMail 不通过后缀发送 SMTP 电子邮件

sql - 使用窗口函数跨分区求和

mysql - MySQL中的临时表定义

mysql - 无法使用 CI 过程返回结果表

Java - 更改 JTable 中某些单元格的颜色

java - XMLGregorianCalendar 类型的 Joda 日期时间格式

java - 转换为父类(super class),并调用重写方法

sql - 了解Oracle别名-为什么除非包装在第二个查询中,否则在查询中为什么不能识别别名?

sql - 如何在oracle中将列varchar更改为clob

java - 如何使用内存数据库编写测试用例?