我在java中使用spring jdbc调用oracle plsql过程时遇到以下错误。
org.springframework.jdbc.BadSqlGrammarException: CallableStatementCallback; bad SQL grammar [{call "Procedure name"; nested exception is java.sql.SQLException: ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'procedure_name'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
这个过程存在于模式S1中的包a下。我已经为这个包a在模式S2中创建了一个同义词,并试图使用spring simplejdbcall执行这个过程,模式名称为S2,但它给了我上面的错误。
但是当我在模式S2中使用SqlPlus执行这个查询时,这个过程执行得很好,这意味着没有授权问题。
当我使用Schema名称执行相同的过程时,它实际上存在(S1),那么使用spring-java也可以执行得很好。
在Schema S2中为这个包A创建同义词是否有任何问题??
我在这里错过了什么吗?
我遇到了同样的问题,就像您显式声明参数一样。修复方法是额外指定:
new SimpleJdbcCall(dataSource)
.withoutProcedureColumnMetaDataAccess()
...
我的假设是同义词阻止了的参数推断工作,而没有实际阻止的发生,因此驱动程序得出结论,存储过程不接受任何参数,因此不发送任何参数。
老问题,所以我知道这对OP没有帮助,但希望它能帮助到一些人。
在没有看到您的代码(PLSQL和Java端)的情况下,我不得不说,过程中需要的参数(参数没有默认值)在Java代码中没有提供,或者过程中的参数名称与您在Java中使用的名称不匹配。
程序规范
PROCEDURE procedure1(value OUT NUMBER,
userId IN NUMBER,
returnCursor OUT PackageA.Types.cursorType);
java代码
SimpleJdbcCall optOutCall = new SimpleJdbcCall(dataSource)
.withSchemaName("Schema-A")
.withCatalogName("PackageA")
.withProcedureName(procedure1)
.declareParameters(new SqlOutParameter("value", Types.NUMERIC),
new SqlParameter("userId", Types.NUMERIC))
.returningResultSet("returnCursor", new UserMapper(EnumType.EMAIL, userId));
这个"procedure1"存在于Schema-B中,但我已经在Schema-A中创建了这个过程的同义词,我正在尝试执行这个过程使用' schema - a ',但它抛出错误,如果我在java代码中给出模式名称"schema - b",那么它会正确执行并返回结果。