Plsql 为什么我在尝试调用过程时得到ORA-06531:对未初始化集合的引用?

Plsql 为什么我在尝试调用过程时得到ORA-06531:对未初始化集合的引用?,plsql,Plsql,我正在尝试调用程序my_package.procedure_test,如下所示: declare v_counter BINARY_INTEGER := 1; a tbl_familles; v_mytable tbl_familles; begin PK_SOA_Famille_Test.get_famille('zz','zz', v_mytable); while v_counter <= v_mytable.count loop

我正在尝试调用程序my_package.procedure_test,如下所示:

declare
   v_counter BINARY_INTEGER := 1;
   a  tbl_familles;
   v_mytable tbl_familles;
begin
  
  PK_SOA_Famille_Test.get_famille('zz','zz', v_mytable);

  while v_counter <= v_mytable.count
   loop
      Dbms_Output.Put_Line(v_mytable(v_counter).nom);
      v_counter := v_counter + 1;
   end loop;
  
end;
程序机构:

CREATE OR REPLACE PACKAGE BODY PK_SOA_Famille_Test AS
  PROCEDURE get_famille
  (num_ass IN VARCHAR2, num_indd IN VARCHAR2, OutTableParam OUT tbl_familles) IS
      v_counter number := 0;      
            
      Cursor C_typ_famille
        (
            num_ass varchar2 ,num_indd varchar2
        ) Is
        SELECT  nom, prenom, num_imm ,num_ind ,nat_int ,dat_naiss, num_cin, der_stat, der_sit, datsit, indpere, indmere
           from typ_famille
           where (num_imm = num_ass AND num_ind = num_indd) ;
        C2 C_typ_famille%ROWTYPE;
      
  BEGIN

  IF   num_indd is null then 
  
     for EmpCursor in
         (select nom,prenom,num_imm ,num_ind, nat_int, dat_naiss, num_cin, der_stat, der_sit, datsit, indpere, indmere
           from typ_famille
           where num_imm = num_ass)
           
     loop
       v_counter := v_counter + 1;
       OutTableParam(v_counter).nom := EmpCursor.nom;
       OutTableParam(v_counter).prenom := EmpCursor.prenom;
       OutTableParam(v_counter).num_imm := EmpCursor.num_imm;
       OutTableParam(v_counter).num_ind := EmpCursor.num_ind;
       OutTableParam(v_counter).nat_int  := EmpCursor.nat_int ;
       OutTableParam(v_counter).dat_naiss := EmpCursor.dat_naiss;
       OutTableParam(v_counter).num_cin := EmpCursor.num_cin;
       OutTableParam(v_counter).der_stat := EmpCursor.der_stat;
       OutTableParam(v_counter).der_sit := EmpCursor.der_sit;
       OutTableParam(v_counter).datsit := EmpCursor.datsit;
       OutTableParam(v_counter).indpere := EmpCursor.indpere;
       OutTableParam(v_counter).indmere := EmpCursor.indmere;
    end loop; 
        
END IF ;
  END get_famille;
END PK_SOA_Famille_Test;
/

我还创建了rec_famille类型作为对象,tbl_familles类型作为模式级别的rec_famille表。

num_indd
notnull
时,则
PK_SOA_famille\u Test。get_famille
实际上什么都不做。这使得
OutTableParam
未初始化。IF语句中可以有一个ELSE,其
OutTableParam:=tbl_familles()如EJ Egyed所建议

此外,通过游标循环填充集合是一种浪费:您应该使用


您是否尝试过初始化变量v_mytable?声明变量时,请尝试如下方式初始化它
v_mytable tbl_familles:=tbl_familles()
CREATE OR REPLACE PACKAGE BODY PK_SOA_Famille_Test AS
  PROCEDURE get_famille
  (num_ass IN VARCHAR2, num_indd IN VARCHAR2, OutTableParam OUT tbl_familles) IS
      v_counter number := 0;      
            
      Cursor C_typ_famille
        (
            num_ass varchar2 ,num_indd varchar2
        ) Is
        SELECT  nom, prenom, num_imm ,num_ind ,nat_int ,dat_naiss, num_cin, der_stat, der_sit, datsit, indpere, indmere
           from typ_famille
           where (num_imm = num_ass AND num_ind = num_indd) ;
        C2 C_typ_famille%ROWTYPE;
      
  BEGIN

  IF   num_indd is null then 
  
     for EmpCursor in
         (select nom,prenom,num_imm ,num_ind, nat_int, dat_naiss, num_cin, der_stat, der_sit, datsit, indpere, indmere
           from typ_famille
           where num_imm = num_ass)
           
     loop
       v_counter := v_counter + 1;
       OutTableParam(v_counter).nom := EmpCursor.nom;
       OutTableParam(v_counter).prenom := EmpCursor.prenom;
       OutTableParam(v_counter).num_imm := EmpCursor.num_imm;
       OutTableParam(v_counter).num_ind := EmpCursor.num_ind;
       OutTableParam(v_counter).nat_int  := EmpCursor.nat_int ;
       OutTableParam(v_counter).dat_naiss := EmpCursor.dat_naiss;
       OutTableParam(v_counter).num_cin := EmpCursor.num_cin;
       OutTableParam(v_counter).der_stat := EmpCursor.der_stat;
       OutTableParam(v_counter).der_sit := EmpCursor.der_sit;
       OutTableParam(v_counter).datsit := EmpCursor.datsit;
       OutTableParam(v_counter).indpere := EmpCursor.indpere;
       OutTableParam(v_counter).indmere := EmpCursor.indmere;
    end loop; 
        
END IF ;
  END get_famille;
END PK_SOA_Famille_Test;
/
CREATE OR REPLACE PACKAGE BODY pk_soa_famille_test IS
  PROCEDURE get_famille(num_ass       IN VARCHAR2,
                        num_indd      IN VARCHAR2,
                        outtableparam OUT) IS
  
  BEGIN
  
    IF num_indd IS NULL THEN
      SELECT nom,
             prenom,
             num_imm,
             num_ind,
             nat_int,
             dat_naiss,
             num_cin,
             der_stat,
             der_sit,
             datsit,
             indpere,
             indmere
        BULK COLLECT
        INTO outtableparam
        FROM typ_famille
       WHERE num_imm = num_ass;
    ELSE
      outtableparam := tbl_familles;
    END IF;
  END get_famille;
END pk_soa_famille_test;