使用Java执行PL SQL
我尝试从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
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,输出参数
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);