2017-03-03 61 views
1

我試圖從我的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(); 
+0

https://www.tutorialspoint.com/jdbc/callablestatement-object-example.htm – OldProgrammer

+0

最好是你創建一個存儲過程,並從Java中調用它...我不確定你可以嵌入在Java中的pl/sql匿名塊 – Dazak

+0

@Dazak - 我會研究如何做到這一點,如果這是執行PLSQL的首選方法 –

回答

0

在您使用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。嘗試使用StringReadersetClob-方法來分配參數中。此外,我不確定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中。

+0

謝謝。我會放棄這一點。將更新結果 –

+0

,所以我試過了,仍然得到相同的錯誤。 我的新代碼讀取。 vStatement.setClob(3,new StringReader(xml));vStatement.registerOutParameter(1,Types.VARCHAR); vStatement.registerOutParameter(2,Types.VARCHAR); vStatement.execute(); –

+0

您是否將prepareCall參數更改爲'「begin mands.Lib_Interface.LoadData(?,?); end;」'? – boskoop