目前,我正在尝试使用oracle中创建的存储过程(sp),它来自spring数据,带有jpa和annotation@procedure。
这看起来很简单,但过程有一个表类型参数(因为它是一个数组),当我在存储库中执行该方法时,会收到以下错误消息:
Caused by: java.sql.SQLException: ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'SP_NAME'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
sp\ U名称(存储过程名称)具有以下声明:
PROCEDURE SP_NAME(mv_name IN MVIEWS_ARRAYS) as ...... more code
正如您在声明sp中看到的,它引用了mviews\u arrays类型,即声明为类型,如下所示:
create or replace TYPE MVIEWS_ARRAYS IS TABLE OF VARCHAR2 (1000);
当我尝试从oracle客户端使用sp时,使用以下代码,它可以正常工作:
DECLARE
mv_name MVIEWS_ARRAYS := MVIEWS_ARRAYS ('1', 'Two', 'Something else');
BEGIN
SP_NAME(mv_name);
END;
但是,当我尝试从java调用sp时,下面的代码就像一个存储库的示例;
@Repository
public interface InterfaceRepositoryExample extends JpaRepository<SomeEntity, Integer>{
@Async
@Procedure("SP_NAME")
public void spName(String[] mvName);
}
我得到了参数类型中的错误(上面的错误)。
我已经搜索过了,但是运气不好,oracle中的表类型和java中的一些原语或 Package 器类型之间没有类型关系,而且,我发现了很多没有响应的post和一些用java创建动态对象的代码,但是我不知道这是否是我正在搜索的。
有人知道我怎样才能解决这个错误吗?。
当做。
编辑时间:
我试过用不同的方法来做,但是我不能使用sp。
1.-使用数组代替字符串[],(参考:https://docs.spring.io/spring-data/jdbc/old-docs/2.0.0.m1/reference/html/orcl.datatypes.html,6.2铭文)
@Repository
public interface InterfaceRepositoryExample extends JpaRepository<SomeEntity, Integer>{
@Async
@Procedure("SP_NAME")
public void spName(Array mvName);
}
从服务中,我正在将字符串[]转换为数组:
java.sql.Array sqlArray = dataSource.getConnection().unwrap(OracleConnection.class).createOracleArray("MVIEWS_ARRAYS ", data);
但我收到了错误信息:
org.springframework.dao.invaliddataaccessapiusageexception:类型不能为空;嵌套异常为java.lang.illegalargumentexception:类型不能为null
2.-可赎回声明:
public void useSP(Array array) throws SQLException {
CallableStatement proc = null;
String sql = "{ call SP_NAME(?) }";
try{
proc = dataSource.getConnection().unwrap(OracleConnection.class).prepareCall(sql);
proc.setArray(1, array);
proc.execute();
}finally{
proc.close();
}
}
从服务中,我正在将字符串[]转换为数组:
java.sql.Array sqlArray = dataSource.getConnection().unwrap(OracleConnection.class).createOracleArray("MVIEWS_ARRAYS ", data);
useSP(sqlArray);
但我收到了错误信息:
java.sql.sqlexception:ora-06550:第1行第7列:pls-00306:调用“sp\u name”时参数的数目或类型错误ora-06550:第1行第7列:pl/sql:忽略语句
1条答案
按热度按时间0tdrvxhp1#
我认为您可以尝试使用jpa来执行语句。然后将您的param作为oracle.array传递作为引用:如何在java中Mapvarchar2(5)的类型表?