java - 在prepareCall后遇到符号\"CLOSE\"

标签 java oracle jdbc plsql callable-statement

pl/sql code TRIGER1

这是我尝试通过 prepareCall 执行的 pl/sql 代码

String sql = String.format(FunctionCalls.TRIGGER1);
CallableStatement callableStatement = null;
Integer result = null;
String err = null;
try {
    callableStatement = connection.prepareCall(sql);

    callableStatement.execute();
    result = callableStatement.getInt("RES_CODE");
    err = callableStatement.getString("RES_DESC" );

执行后,我想获取两个声明的参数,RES_CODERES_DESC,但我收到此错误:

java.sql.SQLException: ORA-06550: line 2, column 1274:\nPLS-00103: Encountered the symbol \"CLOSE\" \n

经过谷歌搜索,很多人认为问题出在游标上,你需要在声明部分声明游标以及BEGIN之后的进程游标,但我是按照它说的做的。在 PL/SQL Developer 中,它工作正常,您可以在图像中看到。

the image

在java中是否可以在执行后获取声明的参数?

是否可以执行TRIGER1 pl/sql代码并获取两个参数RES_CODERES_DESC

最佳答案

作为 CallableStatement 的 javadoc说:“用于执行 SQL 存储过程的接口(interface)。”

javadoc 甚至显示了您必须使用的语法,该语法以 { 大括号开头。

您的 SQL不是存储过程,而是PL/SQL block
此外,RES_CODERES_DESC 不是参数

您尝试做的事情是完全错误的,如果某个网站向您展示了这样做的方法,请立即停止使用该网站。

尝试使用相关代码实际创建一个存储过程,并为该存储过程定义实际参数。

Syntax因为那是:

CREATE PROCEDURE xxx ( RES_CODE OUT number, RES_DESC OUT varchar2 ) AS
  variable declarations here
BEGIN
  code here
END;
/

然后使用以下方法调用该过程:

String sql = "{call xxx(?,?)}";
try (CallableStatement stmt = conn.prepareCall(sql)) {
    stmt.registerOutParameter(1, TYPES.INTEGER);
    stmt.registerOutParameter(2, TYPES.VARCHAR);
    stmt.execute();
    result = stmt.getInt(1);
    err = stmt.getString(2);
}

关于java - 在prepareCall后遇到符号\"CLOSE\",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52021663/

相关文章:

java - 模拟接口(interface)/抽象类时 Mockito InvalidUseOfMatchersException

java - Groovy:从 Closure 对象构建 XML

oracle - 使用一对分隔符 * 和元素分隔符 | 交换 Oracle 记录内的字段

java - 使用 Java 的 DB2 序列值

java - hive 和 spark 分布的 hive thrift 服务器之间的区别

java - istream.write 之后的套接字 DataInputStream 和 EOF 标志 : Is there a "conflict" when writing with istream. writeUTF?

java - Jersey:如何将具有嵌套对象的通用对象打印为 JSON?

sql - 从 Oracle 数据库中的 XML 属性查询时如何使用 XPath 表达式

database - oracle数据库的sqlplus如何列出一个表中的所有数据?

java - 使用 context.xml 更改 jdbc.properties