各位大侠:你们好!
        我碰到了这个ora-06531错误,在网上也查了很久关于这个错误的解决方案,但是对我的问题还是不能解决,所以还是上来请教大侠们了!我的目的是:想将表格A的数据全部保存到数据库中,表A总共有三条记录,每条记录含有2个字段,分别为:QYBH和CHH。请看一下我下面的存储过程:
1 create or replace procedure qcbbm_insert_data(row_arr IN rowArray) AS
                    --汽车磅编码页面(w_qcbbm)---点击保存按钮时将表格中的数据插入数据库存储过程
2  BEGIN3     --首先删除符合条件的数据
      --row_arr(1)(1)为第一条记录的QYBH,row_arr(1)(2)为第一条记录的CHH,其余的依次类推
4     delete from hc_qychd where QYBH = row_arr(1)(1) and CHH = row_arr(1)(2);
5     for m IN 1..row_arr.count
6        loop
7         --然后插入数据
8         insert into hc_qychd (QYBH,CHH) values (row_arr(m)(1),row_arr(m)(2));
9         commit;
10        end loop;
11 END qcbbm_insert_data;
在PL/SQL Dev中的测试代码如下:
1  declare
2  -- Non-scalar 参数需要额外的处理 
3  arr1 my_varArray:=my_varArray('CM091230197','11111111');
4  arr2 my_varArray:=my_varArray('CM091230197','12312312');
5  arr3 my_varArray:=my_varArray('CM091230197','32132132');
6  row_arr rowarray:=rowArray(arr1,arr2,arr3);
7 begin
8 -- Call the procedure
9 qcbbm_insert_data(row_arr => row_arr);
10 end;
测试没有任何问题!其中my_varArray为我自己定义的数据类型(create or replace type my_varArray is table of VARCHAR2(30);)rowArray也是自定义类型(create or replace type rowArray is table of my_varArray;)后台java调用存储过程qcbbm_insert_data的代码如下:
 参数一:arr(整个表格的内容),参数二:sqlText 格式"{call qcbbm_insert_data(?)}"======
=====存储过程:procedure qcbbm_insert_data(row_arr IN rowArray)===============================
1  public void qcbbm_insert_data(String arr[], String sqlText) {
2 OracleCallableStatement proc = null;// 这里的OracleCallableStatement必须
3 ArrayDescriptor desc = null;
4 ARRAY oraArr = null;
5 try {
6 Connection conn = connProc();
7 // conn.setAutoCommit(false);
8 proc = (OracleCallableStatement)conn.prepareCall(sqlText);
9 // 定义oracle中的数组类型
10 desc = ArrayDescriptor.createDescriptor("ROWARRAY",conn);// ROWARRAY这个是oracle中自定义的类型,在此处必须大写,否则会报:无效的名称模式错误
11 oraArr = new ARRAY(desc,conn,arr);
12 proc.setArray(1, oraArr);// 将矩阵作为参数传给存储过程
13 proc.execute();
14 // conn.commit();//提交事务
15 proc.close();
16 conn.close();
17 } catch (SQLException e) {
18 System.out.println("调用存储过程出错!"+e.getMessage());
19 e.printStackTrace();
20 }
21 }
请大侠们帮我看看,我其实就是想在flex前台页面将一个表格中的数据全部取出来放到一个数组里面,然后传递给qcbbm_insert_data方法,然后保存到数据库,就是不知道比较好的办法实现它,请大侠们赐教!先行谢过了!

解决方案 »

  1.   

    各位大侠:你们好!
      我碰到了这个ora-06531错误,在网上也查了很久关于这个错误的解决方案,但是对我的问题还是不能解决,所以还是上来请教大侠们了!我的目的是:想将表格A的数据全部保存到数据库中,表A总共有三条记录,每条记录含有2个字段,分别为:QYBH和CHH。请看一下我下面的存储过程:
    1 create or replace procedure qcbbm_insert_data(row_arr IN rowArray) AS
      --汽车磅编码页面(w_qcbbm)---点击保存按钮时将表格中的数据插入数据库存储过程
    2 BEGIN3  for m IN 1..row_arr.count
    4 loop
    5  --首先删除符合条件的数据
       --row_arr(1)(1)为第一条记录的QYBH,row_arr(1)(2)为第一条记录的CHH,其余的依次类推
    6 delete from hc_qychd where QYBH = row_arr(m)(1) and CHH = row_arr(m)(2);7 --然后插入数据
    8 insert into hc_qychd (QYBH,CHH) values (row_arr(m)(1),row_arr(m)(2));
    9 commit;
    10 end loop;
    11 END qcbbm_insert_data;
    在PL/SQL Dev中的测试代码如下:
    1 declare
    2 -- Non-scalar 参数需要额外的处理  
    3 arr1 my_varArray:=my_varArray('CM091230197','11111111');
    4 arr2 my_varArray:=my_varArray('CM091230197','12312312');
    5 arr3 my_varArray:=my_varArray('CM091230197','32132132');
    6 row_arr rowarray:=rowArray(arr1,arr2,arr3);
    7 begin
    8 -- Call the procedure
    9 qcbbm_insert_data(row_arr => row_arr);
    10 end;
    测试没有任何问题!其中my_varArray为我自己定义的数据类型(create or replace type my_varArray is table of VARCHAR2(30);)rowArray也是自定义类型(create or replace type rowArray is table of my_varArray;)
    后台java调用存储过程qcbbm_insert_data的代码如下:
     参数一:arr(整个表格的内容),参数二:sqlText 格式"{call qcbbm_insert_data(?)}"======
    =====存储过程:procedure qcbbm_insert_data(row_arr IN rowArray)===============================
    1 public void qcbbm_insert_data(String arr[], String sqlText) {
    2 OracleCallableStatement proc = null;// 这里的OracleCallableStatement必须
    3 ArrayDescriptor desc = null;
    4 ARRAY oraArr = null;
    5 try {
    6 Connection conn = connProc();
    7 // conn.setAutoCommit(false);
    8 proc = (OracleCallableStatement)conn.prepareCall(sqlText);
    9 // 定义oracle中的数组类型
    10 desc = ArrayDescriptor.createDescriptor("ROWARRAY",conn);// ROWARRAY这个是oracle中自定义的类型,在此处必须大写,否则会报:无效的名称模式错误
    11 oraArr = new ARRAY(desc,conn,arr);
    12 proc.setArray(1, oraArr);// 将矩阵作为参数传给存储过程
    13 proc.execute();
    14 // conn.commit();//提交事务
    15 proc.close();
    16 conn.close();
    17 } catch (SQLException e) {
    18 System.out.println("调用存储过程出错!"+e.getMessage());
    19 e.printStackTrace();
    20 }
    21 }
    请大侠们帮我看看,我其实就是想在flex前台页面将一个表格中的数据全部取出来放到一个数组里面,然后传递给qcbbm_insert_data方法,然后保存到数据库,就是不知道比较好的办法实现它,请大侠们赐教!先行谢过了!
      

  2.   

    我用的是Tomcat作为服务器,再前台flex页面调用qcbbm_insert_data(java函数)后,Tomcat中出现“ora-06531:引用未初始化的收集”请大侠帮帮我!感激不尽!
      

  3.   


    --ORA-06531: 引用未初始化的收集
    --使用嵌套表时未初始化
    declare
    arr_init my_varArray :=my_varArray(null,null,null);
    --无论你什么时候使用嵌套表,都得先定义,再初始化,最后使用
    begin
    arr_init(1) :='';--参数只有一个
    arr_init(2) :='';
    arr_init(3) :='';
    --row_arr rowarray:=rowArray(arr1,arr2,arr3);
    qcbbm_insert_data(row_arr => row_arr);
    end;
      

  4.   

    _yeeXun哥!你好!
        首先感谢你的回复!经过今天一整天的努力,我终于将这个错误解决了!问题的原因还是在于我没有正确的将前台页面的数组内容传到存储过程参数当中。具体的解决方法,访问下面的网址:http://www.examda.com/oracle/zonghe/20110119/133827478.html,希望给遇到同样问题的同伴提供解决思路!