这是我尝试通过 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_CODE
和 RES_DESC
,但我收到此错误:
java.sql.SQLException: ORA-06550: line 2, column 1274:\nPLS-00103: Encountered the symbol \"CLOSE\" \n
经过谷歌搜索,很多人认为问题出在游标上,你需要在声明部分声明游标以及BEGIN之后的进程游标,但我是按照它说的做的。在 PL/SQL Developer 中,它工作正常,您可以在图像中看到。
在java中是否可以在执行后获取声明的参数?
是否可以执行TRIGER1 pl/sql代码并获取两个参数RES_CODE
和RES_DESC
?
最佳答案
作为 CallableStatement
的 javadoc说:“用于执行 SQL 存储过程的接口(interface)。”
javadoc 甚至显示了您必须使用的语法,该语法以 {
大括号开头。
您的 SQL不是存储过程,而是PL/SQL block 。
此外,RES_CODE
和 RES_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/