使用Java执行PL SQL

使用Java执行PL SQL,java,plsql,Java,Plsql,我尝试从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; 到 但是,当我运行代码时,我得到以下SQLException java.sql.SQLExceptio

我尝试从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;


但是,当我运行代码时,我得到以下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();

但我还是犯了同样的错误

-----------------编辑-----------------------

这是工作代码

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,在参数中
  • Msg,类型VARCHAR2,输出参数
在JDBC代码中,您将过程作为函数调用(请注意赋值运算符)。因此,名为“LOADDATA”的错误号为函数

应将其作为过程调用,参数1为out参数,参数2为in参数:

begin mands.Lib_Interface.LoadData(?, ?); end;
您的代码中还有其他一些小错误:

在Java代码中,您正在为CLOB参数设置一个
字符串。尝试使用
StringReader
setClob
-方法分配in参数。另外,我不确定
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中使用的用户相同

在PL/SQL代码中,您使用两个变量来调用过程:

  • XMLVal,类型:CLOB,在参数中
  • Msg,类型VARCHAR2,输出参数
在JDBC代码中,您将过程作为函数调用(请注意赋值运算符)。因此,名为“LOADDATA”的错误号为函数

应将其作为过程调用,参数1为out参数,参数2为in参数:

begin mands.Lib_Interface.LoadData(?, ?); end;
您的代码中还有其他一些小错误:

在Java代码中,您正在为CLOB参数设置一个
字符串。尝试使用
StringReader
setClob
-方法分配in参数。另外,我不确定
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中使用的用户相同

最好创建一个存储过程,然后从Java调用它。。。我不确定是否可以将pl/sql匿名块嵌入到java@Dazak-如果这是首选的执行方法,我将研究如何做到这一点PLSQL@OldProgrammer-谢谢你的链接。现在阅读:)最好创建一个存储过程,然后从Java调用它。。。我不确定是否可以将pl/sql匿名块嵌入到java@Dazak-如果这是首选的执行方法,我将研究如何做到这一点PLSQL@OldProgrammer-谢谢你的链接。现在阅读:)谢谢。我要试一试。将使用results更新,因此我尝试过,但仍然得到相同的错误。我的新代码是。setClob(3,新的StringReader(xml));registerOutParameter(1,Types.VARCHAR);registerOutParameter(2,Types.VARCHAR);vStatement.execute();是否已将prepareCall参数更改为“begin mands.Lib_Interface.LoadData(?);end;”
?是否确定是相同的错误?原始
PLS-00222:此范围内不存在名为“LOADDATA”的函数
,因为您将其视为过程时的函数。现在,如果您使用@boskoop的版本,您将其正确地视为一个过程,因此它仍然失败,我预计会出现另一个错误。@William Robertson:Thx指出这一点,我本能地在解决方案中更改了它,而没有强调它。这似乎是问题的关键。谢谢。我要试一试。将使用results更新,因此我尝试过,但仍然得到相同的错误。我的新代码是。setClob(3,新的StringReader(xml));registerOutParameter(1,Types.VARCHAR);registerOutParameter(2,Types.VARCHAR);vStatement.execute();是否已将prepareCall参数更改为“begin mands.Lib_Interface.LoadData(?);end;”
?是否确定是相同的错误?原始
PLS-00222:此范围内不存在名为“LOADDATA”的函数
,因为您将其视为过程时的函数。现在,如果您使用@boskoop的版本,您将其正确地视为一个过程,因此它仍然失败,我预计会出现另一个错误。@William Robertson:Thx指出这一点,我本能地在解决方案中更改了它,而没有强调它。这似乎是问题的关键所在。
    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);
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);