2017-03-03 55 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