我尝试从 Java 应用程序运行以下 PL SQL。
SET SERVEROUTPUT ON
DECLARE
XMLVal CLOB := '<some xml here>';
Msg Varchar2(100);
BEGIN
mands.Lib_Interface.LoadData(Msg, XMLVal);
DBMS_OUTPUT.PUT_LINE(Msg);
END;
我的java代码是----编辑-----更新了prepareCall
CallableStatement vStatement = vDatabaseConnection.prepareCall("begin ? := mands.Lib_Interface.LoadData(?, ?); end;");
至
CallableStatement vStatement = vDatabaseConnection.prepareCall("begin mands.Lib_Interface.LoadData(?, ?); end;");
<小时/>
Connection vDatabaseConnection = DriverManager.getConnection(dbAddress, dbSchema,dbScemaPassword);
CallableStatement vStatement = vDatabaseConnection.prepareCall("begin mands.Lib_Interface.LoadData(?, ?); end;");
vStatement.setString(3, xml);
vStatement.registerOutParameter( 1, Types.VARCHAR );
vStatement.registerOutParameter( 2, Types.VARCHAR );
vStatement.executeUpdate();
但是,当我运行代码时,我收到以下 SQLException
java.sql.SQLException: ORA-06550: line 1, column 14:
PLS-00222: no function with name 'LOADDATA' exists in this scope
ORA-06550: line 1, column 7:
通过 SQL Developer 使用该命令时没有任何问题。
我用谷歌搜索了这个问题,但一无所获。任何帮助,将不胜感激。
问候
语气
----------------------------------------编辑------------------------------------
所以我也尝试过
vStatement.setClob(3, new StringReader(xml));
vStatement.registerOutParameter( 1, Types.VARCHAR );
vStatement.registerOutParameter( 2, Types.VARCHAR );
vStatement.execute();
和
Clob clob = vDatabaseConnection.createClob();
clob.setString(1, xml);
vStatement.setClob(3, clob);
vStatement.registerOutParameter( 1, Types.VARCHAR );
vStatement.registerOutParameter( 2, Types.VARCHAR );
但我仍然遇到同样的错误。
-----------------编辑------------------------------------
这是工作代码
Connection vDatabaseConnection = DriverManager.getConnection("dbAddress","dbSchema","dbPassword");
CallableStatement vStatement = vDatabaseConnection.prepareCall("begin mands.Lib_Interface.LoadData(?, ?); end;");
vStatement.setClob(2, new StringReader(xml));
vStatement.registerOutParameter( 1, Types.VARCHAR );
vStatement.executeUpdate();
最佳答案
在 PL/SQL 代码中,您使用 2 个变量来调用过程:
- XMLVal,类型:CLOB,参数内
- 消息,类型 VARCHAR2,输出参数
在 JDBC 代码中,您将过程作为函数调用(注意赋值运算符)。因此,错误没有名称为“LOADDATA”的函数:
begin ? := mands.Lib_Interface.LoadData(?, ?); end;`
您应该将其作为一个过程来调用,其中参数 1 为输出参数,参数 2 为输入参数:
begin mands.Lib_Interface.LoadData(?, ?); end;
您的代码中还存在一些其他小错误:
在 Java 代码中,您正在为 CLOB 参数设置一个String
。尝试使用 StringReader
和 setClob
方法来分配内参数。另外,我不确定 vStatement.executeUpdate()
是否有效,请尝试仅使用 execute
。
Connection vDatabaseConnection = DriverManager.getConnection("jdbc:oracle:thin:@xx.xxx.xx.xxx:1521:xxx", "user","pass");
CallableStatement vStatement = vDatabaseConnection.prepareCall("begin mands.Lib_Interface.LoadData(?, ?); end;");
StringReader reader = new StringReader(xml);
vStatement.registerOutParameter(1, Types.VARCHAR);
vStatement.setClob(2, reader);
vStatement.execute();
String msg = vStatement.getString(1);
或者,您可以尝试 ANSI 92 语法 { call schema.package.procedure(?, ?) }
:
CallableStatement vStatement = vDatabaseConnection.prepareCall("{call mands.Lib_Interface.LoadData(?, ?) }");
StringReader reader = new StringReader(xml);
vStatement.registerOutParameter(1, Types.VARCHAR);
vStatement.setClob(2, reader);
vStatement.execute();
String msg = vStatement.getString(1);
如果仍然不起作用,请确保您在 JDBC 中使用的用户与在 SQL Developer 中使用的用户相同。
关于java - 使用 Java 执行 PL SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42581392/