[英]Execute PL SQL with Java
我有以下PL SQL,我試圖從我的Java應用程序運行。
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命令時沒有問題。
我用谷歌搜索了這個問題,但不知所措。 任何幫助,將不勝感激。
問候
音
- - - - - - - - - - - - - - -編輯 - - - - - - - - - - -----
所以我也試過了
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個變量來調用過程:
在JDBC代碼中,您將過程稱為函數(請注意賦值運算符)。 因此錯誤沒有名為'LOADDATA'的函數 :
begin ? := mands.Lib_Interface.LoadData(?, ?); end;`
你應該把它稱為一個過程,參數1是out-parameter,參數2是in-parameter:
begin mands.Lib_Interface.LoadData(?, ?); end;
您的代碼中還有一些其他小錯誤:
在Java代碼中,您要為CLOB參數設置String
。 嘗試使用帶有setClob
-method的StringReader
來分配in-parameter。 另外,我不確定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中相同的用戶。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.