各位大侠:你们好!
    现在碰到这个问题,网上都说是给不该为空的字段插入了空值。但是我反复检查了,我插入的确实有值。下面是我的存储过程代码和测试参数(my_varArray为我定义的一种数组类型):
1   create or replace procedure w_rldyrbmxb_save(arr IN my_varArray,result OUT VARCHAR2) AS
                     
2   strArr my_varArray:=my_varArray();
                 --1-DYBH,2-GMDW,3-SJ,4-FZ,5-SL,6-JZ,7-YK,8-DWD,PZBM-9,KFRQ-10 strArr中共含有10个元素
3   li_flag INTEGER;--0表示没有记录 非0则表示有记录4    BEGIN   
5         for m in 1..arr.count
6         loop
7             strArr.extend;
8              strArr(m):=arr(m);
9         end loop;
10        select count(*) into li_flag from hc_rldyrbmxb_temp where DYBH = strArr(1);--strArr(1)表示调运编号
          if li_flag=0  then  --没有记录  插入
11                 insert into hc_rldyrbmxb_temp(DYBH,GMDW,SJ,FZ,SL,JZ,YK,DWD,PZBM,KFRQ) values (strArr(1),strArr(2),to_date(strArr(3),'YYYY-MM-DD'),strArr(4),strArr(5),strArr(6),strArr(7),strArr(8),strArr(9),to_date(strArr(10),'YYYY-MM-DD'));
12        else                --有记录    更新
                  update hc_rldyrbmxb_temp set GMDW=strArr(2),SJ=to_date(strArr(3),'YYYY-MM-DD'),FZ=strArr(4),SL=strArr(5),JZ=strArr(6),YK=strArr(7),DWD=strArr(8),PZBM=strArr(9),KFRQ=to_date(strArr(10),'YYYY-MM-DD') where DYBH =strArr(1);
13        end if;
14        if sqlcode=0  then --没有错误  提交事务
15                  result:='保存数据成功!';
16                 commit;
17        else               --有错误的话  撤销事务
18                 result:=sqlerrm;
19                 rollback;
20        end if;21   END w_rldyrbmxb_save;在PL/SQL中测试这个存储过程的参数为:
    arr:=my_vararray('20110609003','七星公司','2011-06-09','合  阳','11','1.00','0.00','','040000000001','2011-06-07');  测试结果是正确的,然而用java代码去调用这个存储过程的时候总是报 ora-01400:无法将 NULL 插入 ("SYSTEM"."HC_RLDYRBMXB_TEMP"."DYBH"),下面为我的java代码:
  参数arr[]:数组参数包含10个元素 ,sqlText为call w_rldyrbmxb_save(?,?)
  public String w_rldyrbmxb_save(String arr[], String sqlText) {
OracleCallableStatement proc = null;// 这里的OracleCallableStatement必须
String result = null;
ArrayDescriptor desc = null;
ARRAY oraArr = null;
try {
Connection conn = connProc();
// conn.setAutoCommit(false);
proc = (OracleCallableStatement)conn.prepareCall(sqlText);
// 定义oracle中的数组类型
desc = ArrayDescriptor.createDescriptor("MY_VARARRAY",conn);// MY_VARARRAY这个是   oracle中自定义的类型,在此处必须大写,否则会报:无效的名称模式错误
oraArr = new ARRAY(desc,conn,arr);
proc.setArray(1, oraArr);// 将矩阵作为参数传给存储过程
proc.registerOutParameter(2,java.sql.Types.VARCHAR);
proc.execute();
result = proc.getString(2);
// conn.commit();//提交事务
proc.close();
conn.close();
return result;
} catch (SQLException e) {
System.out.println("调用存储过程出错!");
e.printStackTrace();
result = "保存数据失败:" + e.getMessage();
return result;
} }
因为我是在flex中访问数据库,所以在flex页面中就将10个元素赋值给一个数组,然后调用上面的方法w_rldyrbmxb_save(String arr[], String sqlText),我调试过了,flex中参数传递都很正常,DYBH的值也传递到数组中了,问题就出在调用这个w_rldyrbmxb_save(String arr[], String sqlText)方法中,但是我找了很久,还是没有发现解决的方法,请各位路过的大侠帮小弟仔细看一下。

解决方案 »

  1.   

    给出创建表的脚本,创建myarray类型的脚本
      

  2.   

    创建my_varArray的脚本为:create or replace type my_varArray is table of VARCHAR2(30);
    表HC_RLDYRBMXB_TEMP的脚本没有找到,这些表是我当时直接导入进去的,不是写脚本创建的,但是我再PL/SQL中看过了,DYBH字段为非空
      

  3.   

    我再PL/SQL中测试存储过程没有任何问题,但是在flex中调用的时候就出现上述问题了,请大侠磅我仔细看看!先行谢过了
      

  4.   

    程序没有问题,需要导入支持字符集的包:nls_charset12.jar
      

  5.   

    非常感谢楼上的tangren大哥!我按照你说的去做,成功了!真诚的说声:谢谢!但是我还是有一点疑惑:这个字符集的包是不是起到了一个把字符串A解析成为字符串B,然后这个字符串B就是oracle认识的字符串了?不知道我的这个理解对不对?还请tangren大哥解释一下!
      

  6.   

    关于oracle字符集一两句话说不清,看一下这个资料
      

  7.   

    怎么导入支持字符集的包:nls_charset12.jar 呢?