-- 自定义字符数组类型,作为传入参数
CREATE OR REPLACE TYPE DWJBSC.STRING_ARR AS TABLE OF VARCHAR2(4000)-- 一个简单的测试,用JAVA写的调用程序,params 赋值为 params['AAAAA','BBBBBB','CCCCC']
create or replace procedure dwjbsc.test2(params in dwjbsc.string_arr,returnStr out varchar2) is
begin
 returnStr := params(1);
end testProc;但是输出的结果时NULL。(如果输入参数类型改成VARCHAR2,赋值为'AAAAA',就输出正确的结果AAAAA。)知道的朋友帮忙看下,谢谢!

解决方案 »

  1.   

    dwjbsc.string_arr参数类型出问题吧
    这是个java的变量吧,不是oracle的类型
      

  2.   

    DECLARE
      TYPE STRING_ARR IS TABLE OF VARCHAR2(4000);
      S_ARR     STRING_ARR := STRING_ARR('AAAAA',
                                         'BBBBBB',
                                         'CCCCC');
      RETURNSTR VARCHAR2(4000);
    BEGIN 
      RETURNSTR := S_ARR(1);
    DBMS_OUTPUT.put_line(RETURNSTR);
    END TESTPROC;
      

  3.   

    看着你的PL SQL 似乎没有问题, 但是你的Java 中是怎么调用的呢?
    估计要是
    String[] strArray = new String[]{"aaa","bbb"}'
    这样调用估计是不行的,你看看Java中支不支持自定义的类型(TYPE)吧
      

  4.   

    应该是调用的时候出现了问题,参考oracle.jdbc.OracleCallableStatement cst2 = (oracle.jdbc.OracleCallableStatement)conn.prepareCall("call ysp_compileupdate(?)");
    oracle.jdbc.OracleConnection oracleConn = (oracle.jdbc.OracleConnection)conn;
    oracle.sql.ArrayDescriptor Test_ARRAY1 =oracle.sql.ArrayDescriptor.createDescriptor("YSTYPE_ARRAY",oracleConn);        
    oracle.sql.ARRAY ora_array1 = new oracle.sql.ARRAY(Test_ARRAY1, oracleConn, id); 
    cst2.setArray(1, ora_array1);
     
      

  5.   


    java调用存储过程中有自定义类型的话,需要register这个类型在java代码里java.sql.CallableStatement cst = con
            prepareCall("call test2(?)");oracle.sql.ArrayDescriptor des_STRING_ARRAY =
                                        oracle.sql.ArrayDescriptor.createDescriptor("STRING_ARR", con);oracle.sql.ARRAY arrayInOracle = new oracle.sql.ARRAY(des_STRING_ARRAY, con, strArrayObjectinJava);
    cst.registerOutParameter(1, OracleTypes.ARRAY,"STRING_ARR");
    cst.setArray(1, arrayInOracle);
    cst.execute();
      

  6.   

    的确是JAVA调用出了问题,将驱动ojdbc14.jar替换为classes12.jar就可以了,谢谢大家。