1

在 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 下。我在模式 S2 中为此包 A 创建了一个同义词,并尝试使用 spring SimpleJdbcCall 执行此过程,模式名称为 S2,但它给了我上述错误。

但是当我在模式 S2 中使用 SqlPlus 执行这个查询时,这个过程执行得很好,这意味着这个没有授权问题。

当我使用它实际存在的模式名称(S1)执行相同的过程时,它也可以使用 spring-java 正常执行。

是否存在与在 Schema S2 中为此包 A 创建的同义词相关的任何问题?

我在这里错过了什么吗?

4

3 回答 3

1

我遇到了同样的问题,就像你明确声明了参数一样。修复是另外指定:

new SimpleJdbcCall(dataSource)
    .withoutProcedureColumnMetaDataAccess()
    ...

我的假设是同义词阻止了参数推断工作而没有真正阻止它的发生,因此驱动程序得出结论,存储过程不接受任何参数,因此不发送任何参数。

老问题,所以我知道这对 OP 没有帮助,但希望它对某人有所帮助。

于 2018-09-04T15:32:32.550 回答
0

在没有看到您的代码(PLSQL 和 Java 端)的情况下,我不得不说该过程具有您未在 Java 代码中提供的必需参数(没有参数的默认值)或过程中的参数名称与您在 Java 中使用的名称不匹配。

于 2014-08-16T15:02:27.737 回答
0

程序规范

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”执行此过程,但如果我将模式名称命名为“Schema-”,则会引发错误B”在java代码中然后它正确执行并返回结果。

于 2014-08-18T13:43:02.943 回答