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

Posted

技术标签:

【中文标题】在prepareCall后遇到符号\\"CLOSE\\"【英文标题】:Encountered the symbol \"CLOSE\" after prepareCall在prepareCall后遇到符号\"CLOSE\" 【发布时间】:2018-08-25 22:18:50 【问题描述】:

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: 第 2 行,第 1274 列:\nPLS-00103: 遇到符号 \"CLOSE\" \n

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

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

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

【问题讨论】:

请发布您执行的实际代码(尽量减少以减少长度),问题不应依赖外部链接获取相关信息。 【参考方案1】:

正如CallableStatement 的 javadoc 所说:“用于执行 SQL 存储过程的接口。”

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);

【讨论】:

感谢您的回答。我不能在这个数据库中创建任何过程。我只能调用函数、过程和运行选择。如果是这样,那么我如何从 java 运行它?

以上是关于在prepareCall后遇到符号\"CLOSE\"的主要内容,如果未能解决你的问题,请参考以下文章

获取 PLS-00103:在创建包时遇到符号“/”错误

遇到符号“文件结尾” - plsql

在oracle sql中,我在删除插入表后创建但收到此错误PLS-00103:遇到符号“DELETE”[重复]

C++无法解析的外部符号

传递多个 oracle PL\SQL 块的 C# 得到“遇到符号 /”

“PLS-00103:在预期以下之一时遇到符号“END”::=。(%;符号“;”被替换为“END”以继续。“