有 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;

我的java代码是-----编辑-----从

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();

共 (1) 个答案

  1. # 1 楼答案

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

    • XMLVal,类型:CLOB,在参数中
    • Msg,输入VARCHAR2,输出参数

    在JDBC代码中,您将过程作为函数调用(请注意赋值运算符)。因此,名为“LOADDATA”的错误函数no

    begin ? := mands.Lib_Interface.LoadData(?, ?); end;`
    

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

    begin mands.Lib_Interface.LoadData(?, ?); end;
    

    此外,代码中还有其他一些小错误:

    在Java代码中,您正在为CLOB参数设置一个String。尝试使用StringReadersetClob-方法来分配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中使用的用户相同