将java类型string []映射到oracle类型

时间:2014-12-26 20:29:53

标签: java oracle type-conversion

有一些java类,加载到Oracle数据库(版本11g)和pl / sql函数包装器:

create or replace function getDataFromJava( in_uListOfSms  in tStringArray )
return tStringArray    
as language java name 'JavaClass.getSms( java.lang.String[]) return java.lang.String[]';    

从示例中我可以看到,我尝试匹配java数据类型' java.lang.String []'到Oracle数据类型:

create or replace type tStringArray as table of varchar2(4000);

然后当我运行此代码时:

declare
  in_array  tStringArray := tStringArray();    
  out_array tStringArray := tStringArray();    
begin    

  in_array.EXTEND;    
  in_array(1) := '1';    
  in_array.EXTEND;    
  in_array(2) := '2';    
  in_array.EXTEND;    
  in_array(3) := '3';    

    out_array := getDataFromJava( in_array );    

      for i in 1..3    
      loop    
        dbms_output.put_line(out_array(i));    
      end loop;    
end;    

因此我收到错误:

ORA-00932: inconsistent datatypes expected a java type at argument position 2 to which some Oracle value can be converted got something else   

1 个答案:

答案 0 :(得分:0)

好吧,我已经做到了!我的方法中的关键错误是java数据类型String []应该与基于" varchar2"表的oracle dstatape匹配。那是错的。如果你必须使用strins / numbers / date数组输入/输出参数,你应该使用oracle.sql.ARRAY数据类型。 这是这种方法的一个小例子:

  1. 创建oracle数据类型:

    创建或替换类型tFilesList AS TABLE OF VARCHAR2(2000);

  2. 创建返回oracle.sql.ARRAY的方法:

    创建或替换并编译名为" DirInfo"的Java源代码。如

  3. import java.io.File;    
    import java.sql.*;    
    import oracle.sql.*;    
    import oracle.jdbc.*;    
    
    public class DirInfo {    
    
      public static oracle.sql.ARRAY getFilesList (String dirName) throws java.sql.SQLException {    
    
          Connection orclConnection = new OracleDriver().defaultConnection();    
    
          ArrayDescriptor arrayDesc = ArrayDescriptor.createDescriptor ("TFILESLIST", orclConnection);    
    
          File filesDir = new File (dirName);    
    
          String[] filesList = filesDir.list();    
    
          ARRAY dirArray = new ARRAY(arrayDesc, orclConnection, filesList);    
    
          return dirArray;    
      }
    }
    
    1. 创建pl / sql函数包装器:

      创建或替换函数getDirList(varchar2中的dirName)
      return tFilesList
      作为
      language java name' DirInfo.getFilesList(java.lang.String)return
      oracle.sql.ARRAY&#39 ;;

    2. 测试:

    3.  declare    
             myDdir tFilesList;    
          begin    
            myDdir := getDirList ('C:\Program Files');    
              for i in 1..myDdir.COUNT    
              loop    
                dbms_output.put_line(myDdir(i));    
              end loop;    
          end;