在存储过程调用期间使用 CallableStatement 的 SQL 语句无效

Posted

技术标签:

【中文标题】在存储过程调用期间使用 CallableStatement 的 SQL 语句无效【英文标题】:Invalid SQL statement with CallableStatement during Stored proc call 【发布时间】:2020-04-07 15:43:42 【问题描述】:

我有下面的代码来调用带有某些参数的存储过程。

但是它在callableStatement.execute(); 上失败并出现错误:

java.sql.SQLSyntaxErrorException: ORA-00900: invalid SQL statement

public void setContext(String userId, String someId, List<String> accountsList) 
        List<SqlParameter> parameters = Collections.singletonList(new SqlInOutParameter("output", Types.VARCHAR));
        log.info("executing stored procedure with user id: ", userId);
        Map<String, Object> t =  defaultTemplate.call(connection -> 
            CallableStatement callableStatement = connection.prepareCall("STORED_PROC(?, ?, ?, ?)");
            callableStatement.setString(1, userId);
            callableStatement.registerOutParameter(2, Types.VARCHAR);
            callableStatement.setString(3, someId);
            OracleConnection oracleConnection = connection.unwrap(OracleConnection.class);
            Array array = oracleConnection.createOracleArray("SOME_TYPE", accountsList.toArray());
            callableStatement.setArray(4, array);
            callableStatement.execute();
            return callableStatement;
        , parameters);
        log.info("Status of the stored procedure: ", t.get("status_output"));
 

我做错了什么?

【问题讨论】:

检查下面的陈述是否正确 【参考方案1】:

你可以在调用你的过程时写call语句

CallableStatement callableStatement = connection.prepareCall("call STORED_PROC(?, ?, ?, ?)");

【讨论】:

【参考方案2】:
CallableStatement callableStatement = connection.prepareCall("STORED_PROC(?, ?, ?, ?)");

放在参数周围。并在语句之前添加调用。如下所示:

CallableStatement callableStatement = connection.prepareCall("call STORED_PROC(?, ?, ?, ?)");

【讨论】:

是的,我错过了“呼叫关键字”。这个是正确的。 @Plainsage 提供您的存储过程,以便我们更好地了解。 @Ergi Nushi stored_proc(userId in varchar2, sid in out varchar2, someId in varchar2, v_acct_list in some_type, v_keep_forever in char default 'N');这是存储过程签名

以上是关于在存储过程调用期间使用 CallableStatement 的 SQL 语句无效的主要内容,如果未能解决你的问题,请参考以下文章

MS SQL 和 Java:在调用存储过程期间找不到表变量

在存储过程调用期间,您何时可以看到更新、插入和删除的效果?

使用事务内的临时表调用存储过程

虚拟机字节码执行引擎-----方法调用

我们如何避免并行执行存储过程?

Perl 在可存储写入期间是不是安全地延迟 INT 信号?