簡體   English   中英

用Java執行PL SQL

[英]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個變量來調用過程:

  • XMLVal,類型:CLOB,in-parameter
  • Msg,類型VARCHAR2,out-parameter

在JDBC代碼中,您將過程稱為函數(請注意賦值運算符)。 因此錯誤沒有名為'LO​​ADDATA'的函數

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM