通过 Java 调用 PL\SQL:将参数注册为布尔值

Posted

技术标签:

【中文标题】通过 Java 调用 PL\\SQL:将参数注册为布尔值【英文标题】:Call PL\SQL via Java: Registering out parameter as boolean通过 Java 调用 PL\SQL:将参数注册为布尔值 【发布时间】:2015-09-21 22:51:31 【问题描述】:

我在 Java 应用程序中调用 PL/SQL 过程来更新数据库条目。

Connection connection = null;
CallableStatement preparedCall = null;
Integer result = 0;
preparedCall = connection.prepareCall(" ?= call pkg_temp.update_data(?, ?)");
preparedCall.registerOutParameter(1, OracleTypes.BOOLEAN);
preparedCall.setString(2, variable1);
preparedCall.setString(3, cariable2);
result = preparedCall.executeUpdate();

但我在 executeUpdate() 处收到以下错误

Severe: java.sql.SQLException: ORA-06550: line 1, column 13: PLS-00382: expression is of wrong type ORA-06550: line 1, column 7: PL/SQL: Statement ignored

原因:PL\SQL 不允许我注册到不是主要类型的布尔类型。

如何调用这个函数?

【问题讨论】:

在这个帖子里你会找到你的问题的答案http://***.com/questions/12890883/how-to-call-a-function-in-plsql-function 对不起罗德里戈,我是这方面的初学者,无法真正理解其他线程中的答案。 好的,首先,你确定你的函数的输出类型是布尔值吗? 布尔值是一种 PL/SQL 数据类型,在 SQL 中不存在。这意味着当你的 PL/SQL 函数返回一个布尔值时,你不能在 SQL 中使用它。 这是您收到该错误的原因 【参考方案1】:

终于设法编写了一个包装器来获取布尔值并返回一个像这样的整数。

Connection connection = null;
CallableStatement preparedCall = null;
Integer result = 0;
preparedCall = connection.prepareCall(
                    "BEGIN " +
                    " ?:= CASE pkg_temp.update_data(?, ?) "+
                    " WHEN TRUE THEN 1 " +  " ELSE 0 " +
                    " END; " +
                    "END; "
                    );
preparedCall.registerOutParameter(1, OracleTypes.INTEGER);
preparedCall.setString(2, variable1);
preparedCall.setString(3, variable2);
result = preparedCall.executeUpdate();
int funcRetValue = preparedCall.getInt(1);
if (funcRetValue == 1) 
    retValue = true;
 else 
    retValue = false;

【讨论】:

以上是关于通过 Java 调用 PL\SQL:将参数注册为布尔值的主要内容,如果未能解决你的问题,请参考以下文章

使用带有布尔输入参数的 PL/SQL 在 oracle 中调用 java 存储过程

如何在java中调用不带参数的PL/SQL函数

如何使用参数从 Oracle PL/SQL 执行 Java jar 文件?

如何通过 Java EntityManager 调用 PL/SQL 存储函数

如何调用具有 IN/OUT 参数并通过 DB Link 返回 BLOB 的 Oracle PL/SQL 函数

ORACLE PL/SQL:使用多个参数调用存储过程函数(DML 查询)