现想实现一个更新的存储过程 , 因有部分参数除外 所以自定义了一个数组.
编译什么的都成功了, 但是用plsql测试存储过程的时候,只有两个参数,自定义参数不能填写.
导致测试时报错 引用为'引用未初始化的收集' , 请各位不吝赐教,谢谢啦
自定义数组类型:create or replace type array_num is table of number(19)
下面是存储过程代码:create or replace procedure directory_path_change(from_catalogId integer,to_catalogId integer,except_array array_num) is
----把采购分类下的采购品平移到另一分类下, except_array 除外的采购品
  tmp_ID         NUMBER(19);               --需要转移的采购品ID
  catalog_treepath  VARCHAR2(768 CHAR);    --目标分类的路径
  
  i number(10); --数组下标 从1开始
  isUpdate number(1); --是否执行更新 0:不执行 ;1:执行
cursor directory_cursor is
       select id from corp_directorys d where d.catalog_id = from_catalogId;
begin
 select treepath into catalog_treepath from corp_catalogs where id = to_catalogId;
savepoint p1;         -- 设置回滚点
  open directory_cursor;
  loop
         fetch directory_cursor into
               tmp_ID;
         exit when directory_cursor%NOTFOUND;
         DBMS_OUTPUT.PUT_LINE('=============ID:');
         DBMS_OUTPUT.PUT_LINE(tmp_ID);
    
        
         i := 1;
         isUpdate := 0;
         for i in 1..except_array.count Loop
             if except_array(i)=tmp_ID then
                isUpdate := 1;
             end if;
         end loop;
             if isUpdate=1 then
             update corp_directorys d set d.catalog_id = to_catalogId , d.treepath = (catalog_treepath||d.id||'#') where d.id =tmp_ID;
         end if;
         commit;       
  end loop;
  
  close directory_cursor;
  
  --发生异常时,数据回滚
  exception
      when others then
        dbms_output.put_line(sqlerrm);
      rollback to savepoint p1;
        
 
end directory_path_change;

解决方案 »

  1.   

    数组类型参数except_array不能输入?
      

  2.   

    是的 , 没有except_array赋值的地方. 
    自己添加的话,
    1.类型列表里也没有我自定义的数组类型.
    2.即使乱选一个数据类型的时候, 会报错 except_array 未定义.
      

  3.   

    18-17:使用集合变量作为输入参数   
        CREATE TYPE deptno_table_type IS TABLE OF NUMBER(2);   
        /   
        CREATE TYPE dname_table_type IS TABLE OF VARCHAR2(10);   
        /   
        CREATE TYPE loc_table_type IS TABLE OF VARCHAR2(20);   
        /   
        CREATE OR REPLACE PROCEDURE add_department(   
          deptno_table deptno_table_type,   
          dname_table dname_table_type,loc_table loc_table_type)   
        IS   
        BEGIN   
          FORALL i IN 1..deptno_table.COUNT   
            INSERT INTO dept VALUES   
              (deptno_table(i),dname_table(i),loc_table(i));   
        EXCEPTION   
          WHEN DUP_VAL_ON_INDEX THEN   
            RAISE_APPLICATION_ERROR(-20012,'部门号不能重复');   
        END;   
        /   
        DECLARE   
          deptno_table deptno_table_type:=deptno_table_type(60,70,80);   
          dname_table dname_table_type :=dname_table_type('计划处','质量处','技术处');   
          loc_table loc_table_type:=loc_table_type('呼和浩特','包头','乌海');   
        BEGIN   
          add_department(deptno_table,dname_table,loc_table);   
        END;   
        /   
    18-18:使用集合变量作为输出参数   
        CREATE TYPE ename_table_type IS TABLE OF VARCHAR2(10);   
        /   
        CREATE TYPE job_table_type IS TABLE OF VARCHAR2(10);   
        /   
        CREATE OR REPLACE PROCEDURE get_emp(   
          dno NUMBER,ename_table OUT ename_table_type,   
          job_table OUT job_table_type) IS   
        BEGIN   
          SELECT ename,job BULK COLLECT INTO ename_table,job_table   
          FROM emp WHERE deptno=dno;   
        EXCEPTION   
          WHEN NO_DATA_FOUND THEN   
            RAISE_APPLICATION_ERROR(-20010,'该部门不存在');   
        END;   
        /   
        DECLARE   
          ename_table ename_table_type;   
          job_table job_table_type;   
        BEGIN   
          get_emp(&dno,ename_table,job_table);   
          FOR i IN 1..ename_table.COUNT LOOP   
            dbms_output.put_line('姓名:'||ename_table(i)   
             ||',岗位:'||job_table(i));   
          END LOOP;   
        END;   
        /   
      

  4.   

    问题解决了.  哎... 不知道是不是plsql的存储过程test方法不能直接传数组参数.
    直接传参调用时可以的,无语. 
    谢谢各位了. 代码贴出来分享下 .declare
          except_array   array_num   :=   array_num( 90818041); 
          from_catalogid number :=90818040;
          to_catalogid number :=91469311;
    begin
      -- Call the procedure
      directory_path_change(from_catalogid ,to_catalogid ,except_array);
    end;