使用Java执行PL SQL
我试图从我的Java应用程序运行以下PL SQL。使用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代码---- ----- EDITED更新的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中使用该命令时,我没有任何问题。
我已经搜索了这个问题,但不知所措。任何帮助,将不胜感激。
问候
音
----------------------------- EDIT ------ -------------------
所以我也尝试
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();
在您使用2个变量调用过程中的PL/SQL代码:
- XMLVal,类型:CLOB,在参数
- 消息,类型VARCHAR2,输出参数
在JDBC代码中,您将过程作为函数调用(请注意赋值运算符)。因此,错误没有功能名为“LOADDATA”:
begin mands.Lib_Interface.LoadData(?, ?); end;
:
begin ? := mands.Lib_Interface.LoadData(?, ?); end;`
您应该参数1为外部参数和参数2的参数把它作为一个过程
您的代码中还存在其他一些小错误:
在您的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中。
谢谢。我会放弃这一点。将更新结果 –
,所以我试过了,仍然得到相同的错误。 我的新代码读取。 vStatement.setClob(3,new StringReader(xml));vStatement.registerOutParameter(1,Types.VARCHAR); vStatement.registerOutParameter(2,Types.VARCHAR); vStatement.execute(); –
您是否将prepareCall参数更改为'“begin mands.Lib_Interface.LoadData(?,?); end;”'? – boskoop
https://www.tutorialspoint.com/jdbc/callablestatement-object-example.htm – OldProgrammer
最好是你创建一个存储过程,并从Java中调用它...我不确定你可以嵌入在Java中的pl/sql匿名块 – Dazak
@Dazak - 我会研究如何做到这一点,如果这是执行PLSQL的首选方法 –