【问题标题】:Mapping java type string[] to oracle type将 java 类型 string[] 映射到 oracle 类型
【发布时间】:2015-02-24 00:47:39
【问题描述】:

有一些 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   

【问题讨论】:

标签: java oracle type-conversion


【解决方案1】:

好吧,我做到了!我的方法中的关键错误是 java 数据类型 String[] 应该与基于“varchar2 表”的 oracle dstatape 匹配的印象。那是错误的。如果您必须将输入/输出参数作为字符串/数字/日期数组,您应该使用 oracle.sql.ARRAY 数据类型。 这里是这种方法的小例子:

  1. 创建 oracle 数据类型:

    创建或替换类型 tFilesList 作为 VARCHAR2(2000) 的表;

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

    创建或替换并编译名为“DirInfo”的java源为

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)
    返回 tFilesList
    作为
    语言 java 名称 'DirInfo.getFilesList(java.lang.String) 返回
    oracle.sql.ARRAY';

  2. 测试:

 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 2012-10-08
    • 2011-03-11
    • 2016-09-29
    • 1970-01-01
    相关资源
    最近更新 更多