将对象数组从 PLSQL 传递到 Java 函数时出错

Posted

技术标签:

【中文标题】将对象数组从 PLSQL 传递到 Java 函数时出错【英文标题】:Error while passing object array from PLSQL to Java function 【发布时间】:2016-02-16 00:11:27 【问题描述】:

我有一个 abc_type 类型和一个 abc_table 类型的数组。 我正在尝试将对象数组传递给 java 函数。

create type abc_type authid definer as object
  ( file_name    varchar2(5000),
    file_size    number,
    file_paths   varchar2(4000)
    );
create type abc_table as table of abc_type;

create or replace and compile java source named "Hello" as
public class Hello

  public static String world(String str,Array str2)
  
    return "Hello world - "+ str;
  

/

CREATE OR REPLACE FUNCTION helloworld (
str_in in varchar2,
str2_in in abc_table
)
RETURN VARCHAR2 AS
LANGUAGE JAVA NAME 'Hello.world (java.lang.String,oracle.sql.Array) return java.lang.String';
/

declare 
str varchar2(200):='def';
zipfiles abc_table:=abc_table();
begin
zipfiles.extend(1);
zipfiles(1) := abc_type('aaa',22,'bbb');
dbms_output.put_line('test:'||helloworld('abc',zipfiles));
end;
/

一切编译正常,但我收到错误 ORA-29541: class .Hello could not be resolved。 如果我用 String/Varchar2 替换 Array 类型,它工作正常。

标题

【问题讨论】:

尝试在 Java 源代码的开头添加 import oracle.sql.Array; 【参考方案1】:

您应该使用 import oracle.sql。ARRAY

create or replace  and COMPILE java source named "Hello" as
import oracle.sql.ARRAY;
public class Hello

  public static String world(String str,ARRAY str2)
  
    return "Hello world - "+ str;
  

我认为您不能将复合类型(嵌套表)从 PL/SQL 传递给 java 函数。在您的情况下,您传递的是复合数据类型的 abc_type。据我所知,嵌套表或一维或单一数据类型的数组只能传递。我不是很确定,请考虑我的想法。

请检查以下链接是否相同 https://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:8908169959941

【讨论】:

谢谢!该链接非常有帮助。我能够传递复合类型。 你是如何传递复合类型的? 您可以查看我的回答中的“最终代码”。我正在传递一个复合类型。【参考方案2】:

修复了以下更改

添加了导入语句

import oracle.sql.*; // I had added this earlier, but this alone didn't fix the issue.
import java.sql.*;

//With the above, I was able to pass the object, but I was not able to reference the object.

添加了异常处理。

throws IOException,java.sql.SQLException to the function.

最终代码(还有一些其他更改)

create or replace and compile java source named "Hello" as
package abc;

    import oracle.sql.*;
    import java.sql.*;
    import java.io.*;
    import java.util.ArrayList;
    import java.util.zip.*;
    import java.sql.Connection;

    public class Hello extends Object
    
      public static void world(String str,String[] strout, oracle.sql.ARRAY arr) throws IOException,java.sql.SQLException
      
          Datum[] ZipTyp = ((ARRAY)arr).getOracleArray();
          strout[0] = "Output - "+ str + ","+arr.getSQLTypeName()+ ","+ java.lang.reflect.Array.getLength(ZipTyp);
      
    
    /

    CREATE OR REPLACE PROCEDURE helloworld2 (
    str_in IN varchar2,
    str_out OUT varchar2,
    arr_in in abc_table
    )AS
    LANGUAGE JAVA 
    NAME 'abc.Hello.world (java.lang.String,java.lang.String[],oracle.sql.ARRAY)';
    /

    declare 
      str varchar2(200):='def';
      zipfilelist abc_table := abc_table();
      l_in v_table := v_table();
    begin
      zipfilelist.extend(2);
      zipfilelist(1) := abc_type('aaa1',11,'bbb1');
      zipfilelist(2) := abc_type('aaa2',22,'bbb2');
      helloworld2('abc',str,zipfilelist);
      dbms_output.put_line('test:'||str);
    end;
    /

【讨论】:

以上是关于将对象数组从 PLSQL 传递到 Java 函数时出错的主要内容,如果未能解决你的问题,请参考以下文章

SWIG:如何将 C++ 对象数组从 C# 传递到 C++?

如何使用 pdo 将字符串数组传递给 php 中的 plsql 例程

java数组作为参数传入函数怎么让他不变化

将字符串数组从 VB6 传递到 COM 对象

如何将数组变量从 VBA 传递到 vb.net 函数

将参数从php中的数组传递给构造函数[重复]