java - 使用 Java 执行 PL SQL

标签 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代码是----编辑-----更新了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,参数内
  • 消息,类型 VARCHAR2,输出参数

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

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

您应该将其作为一个过程来调用,其中参数 1 为输出参数,参数 2 为输入参数:

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

您的代码中还存在一些其他小错误:

在 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 中使用的用户相同。

关于java - 使用 Java 执行 PL SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42581392/

相关文章:

java - Hibernate 将日期格式转换为问号

java - RDD 的垃圾收集

java - 您如何在 Java 中重现常量指针的行为?

linux - 使用 Oracle PL/SQL SP 在不同的 Linux 服务器上运行 Shell 脚本

sql - Oracle函数: How to pass a table name as parameter,并使用游标结果作为表名?

oracle - 如何将 SELECT LISTAGG 值插入到 varchar 变量

java - GridBagLayout,如何在放置组件时阻止屏幕拉伸(stretch)?

java - 使类可打印

sql - 在 SQL 中的 LEFT OUTER JOIN 中使用 CASE 语句

oracle - 如何使用正则表达式将数组中的项目与数据库列中的项目进行比较?