prepareCall 后遇到符号 \"CLOSE\"

Encountered the symbol \"CLOSE\" after prepareCall

pl/sql code TRIGER1

这是我的 pl/sql 代码,我试图通过 prepareCall

执行
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

google了一下,很多人认为问题出在cursor,需要在declaration section中声明cursors,在BEGIN之后process cursor,但是我是照着说的去做。在 PL/SQL Developer 中,它工作正常,您可以在图像中看到。

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

是否可以执行TRIGER1 pl/sql代码,得到RES_CODERES_DESC两个参数?

正如 CallableStatement 的 javadoc 所说:"The interface used to execute SQL stored procedures."

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

你的SQL是不是一个存储过程,它是一个PL/SQL区块.
另外,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);
}