有一些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
答案 0 :(得分:0)
好吧,我已经做到了!我的方法中的关键错误是java数据类型String []应该与基于" varchar2"表的oracle dstatape匹配。那是错的。如果你必须使用strins / numbers / date数组输入/输出参数,你应该使用oracle.sql.ARRAY数据类型。 这是这种方法的一个小例子:
创建oracle数据类型:
创建或替换类型tFilesList AS TABLE OF VARCHAR2(2000);
创建返回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; } }
创建pl / sql函数包装器:
创建或替换函数getDirList(varchar2中的dirName)
return tFilesList
作为
language java name' DirInfo.getFilesList(java.lang.String)return
oracle.sql.ARRAY&#39 ;;
测试:
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;