Oracle11g 失败?如果fk是一个整数,你不能像这样使用它:fk.table\u name尽管我在第53行不是SQL expertERROR:ORA-06550:line 53,第28列:PLS-00364:循环索引变量“TAB\u NAMES”的使用无效ORA-065

Oracle11g 失败?如果fk是一个整数,你不能像这样使用它:fk.table\u name尽管我在第53行不是SQL expertERROR:ORA-06550:line 53,第28列:PLS-00364:循环索引变量“TAB\u NAMES”的使用无效ORA-065,oracle11g,cursor,Oracle11g,Cursor,失败?如果fk是一个整数,你不能像这样使用它:fk.table\u name尽管我在第53行不是SQL expertERROR:ORA-06550:line 53,第28列:PLS-00364:循环索引变量“TAB\u NAMES”的使用无效ORA-06550:line 53,第10列:PL/SQL:Statement被忽略它抛出上述错误我已编辑答案以尝试使用索引。看看它是否有效。很遗憾,我没有访问oracle环境的权限。我强烈建议您阅读批量收集手册。 ERROR at line 58: ORA


失败?如果
fk
是一个整数,你不能像这样使用它:
fk.table\u name
尽管我在第53行不是SQL expertERROR:ORA-06550:line 53,第28列:PLS-00364:循环索引变量“TAB\u NAMES”的使用无效ORA-06550:line 53,第10列:PL/SQL:Statement被忽略它抛出上述错误我已编辑答案以尝试使用索引。看看它是否有效。很遗憾,我没有访问oracle环境的权限。我强烈建议您阅读批量收集手册。
ERROR at line 58:
ORA-06550: line 58, column 53:
PLS-00487: Invalid reference to variable 'FK'
ORA-06550: line 58, column 9:
PL/SQL: Statement ignored
ORA-06550: line 59, column 46:
PLS-00487: Invalid reference to variable 'FK'
ORA-06550: line 59, column 9:
PL/SQL: Statement ignored
v_program_sec VARCHAR2(50);     
cntr INTEGER :=0;   
TYPE tab_name IS TABLE OF all_constraints.table_name%TYPE; 
tab_names tab_name; 
 cursor all_cons is
 select table_name
 from ALL_CONSTRAINTS
 where constraint_type = 'R'
 and r_constraint_name =
 (select constraint_name
 from ALL_CONSTRAINTS
 where constraint_type='P'
 and table_name='POLICIES')
 and table_name not in ('POLICY_AMOUNTS',
 'POLICY_DATES','FUND_POLICIES',
 'PNDNG_UW_REQUIREMENTS','RIDERS','TEMP_PARTIES',
 'POLICY_AMOUNTS_HISTORY','AGREEMENTS','NFHST','VLRP_RIDER');
fk PLS_INTEGER; 
procedure log_error 
    (p_err_cd IN NUMBER, p_err_msg IN VARCHAR2,
     p_program_sec IN VARCHAR2, p_ref_num IN VARCHAR2)
  is
  begin
    rollback;
    insert into LOAD_ERROR_LOG
      (err_cd, err_msg, program_sec, rec_hit)
    values
      (p_err_cd, p_err_msg, p_program_sec,
       'VLDM1060 '||p_ref_num||to_char(SYSDATE,' hh24:mi mmddyyyy'));
    commit;
  end;
BEGIN 
OPEN all_cons; 
FETCH all_cons BULK COLLECT INTO tab_names; 
-- existing policies
  for infc_pol in 
    (select TEMP_POLICIES.*,
            POLICIES.rowid p_rowid, POLICIES.status_cd p_status_cd 
       from POLICIES, TEMP_POLICIES 
      where POLICIES.policy_num = TEMP_POLICIES.policy_num
        and TEMP_POLICIES.status_cd in ('0','1','2','3','4','5','6','7','8','L','Z')
      order by POLICIES.rowid
    )
  loop
    v_program_sec := 'Delete child records - INFC';
    declare
      del_cursor INTEGER;
      exe_cursor INTEGER;
      cntr       INTEGER :=0;

    begin
         for fk IN  1..tab_names.count  
      loop
        v_program_sec := 'Delete records from '||fk.table_name||' - INFC';
        EXECUTE IMMEDIATE 'delete from '||fk.table_name||
          ' where pcy_policy_num = '||''''||infc_pol.policy_num||'''';
      end loop;       
        v_program_sec := 'Delete records from RIDERS - INFC';
        delete from RIDERS
         where pcy_policy_num = infc_pol.policy_num; 
        v_program_sec := 'Delete records from PNDNG_UW_REQUIREMENTS - INFC';
        delete from PNDNG_UW_REQUIREMENTS
         where pcy_policy_num = infc_pol.policy_num;
        v_program_sec := 'Delete records from POLICY_AMOUNTS - INFC';
        delete from POLICY_AMOUNTS
         where amt_code <> '10'
           and pcy_policy_num = infc_pol.policy_num;
        v_program_sec := 'Delete records from POLICY_DATES - INFC';
        delete from POLICY_DATES
         where daty_code not in ('01','03','04','17','18','20','21')
           and pcy_policy_num = infc_pol.policy_num;
      v_program_sec := 'Update policy record - INFC'; 
      update POLICIES
         set status_cd = infc_pol.status_cd,
             paymnt_mode_cd = infc_pol.paymnt_mode_cd,
             company_cd = infc_pol.company_cd,
             fund_typ = infc_pol.fund_typ, 
             partcpng_ind = infc_pol.partcpng_ind,
             distrb_cd = infc_pol.distrb_cd, 
             product_typ = infc_pol.product_typ,
             restricted_ind = infc_pol.restricted_ind, 
             acct_exec_id = infc_pol.acct_exec_id, 
             rollover_ind = infc_pol.rollover_ind, 
             loan_ind = infc_pol.loan_ind,
             cod_ind = infc_pol.cod_ind, 
             billng_mthd_cd = infc_pol.billng_mthd_cd,
             db_option_cd = infc_pol.db_option_cd,
             iss_state_cd = infc_pol.iss_state_cd,
             reinsure_ind = infc_pol.reinsure_ind,
             restrctns_ind = infc_pol.restrctns_ind,
             tax_status_cd = infc_pol.tax_status_cd,
             cvat_ind = infc_pol.cvat_ind,
             plan_cd = infc_pol.plan_cd,
             payor_grp_num = infc_pol.payor_grp_num, 
             last_update_dt = infc_pol.last_update_dt,
             spec_risk_ind = infc_pol.spec_risk_ind
       where policy_num = infc_pol.policy_num;
       commit;
       exception
      when OTHERS then
        declare
          error_code NUMBER := SQLCODE;
          error_msg  VARCHAR2(300) := SQLERRM;
        begin
          log_error(error_code, error_msg, v_program_sec, infc_pol.policy_num);
        end;
    CLOSE all_cons; 
    end;  
  end loop;  
  -- new policies
  begin
    v_program_sec := 'insert new INFC policies from TEMP_POLICIES';
    insert into policies
      (policy_num, status_cd, paymnt_mode_cd, company_cd,
       fund_typ, partcpng_ind, distrb_cd, product_typ,
       restricted_ind, acct_exec_id, rollover_ind, loan_ind,
       cod_ind, billng_mthd_cd, db_option_cd, iss_state_cd,
       reinsure_ind, restrctns_ind, tax_status_cd, cvat_ind,
       plan_cd, payor_grp_num, last_update_dt, spec_risk_ind)
    select 
       policy_num, status_cd, paymnt_mode_cd, company_cd,
       fund_typ, partcpng_ind, distrb_cd, product_typ,
       restricted_ind, acct_exec_id, rollover_ind, loan_ind,
       cod_ind, billng_mthd_cd, db_option_cd, iss_state_cd,
       reinsure_ind, restrctns_ind, tax_status_cd, cvat_ind,
       plan_cd, payor_grp_num, last_update_dt, spec_risk_ind
      from TEMP_POLICIES tp
     where not exists (select 'x'
                  from POLICIES
                 where policy_num = tp.policy_num)
       and status_cd in ('0','1','2','3','4','5','6','7','8','L','Z');
    commit;
  exception
    when OTHERS then
      declare
        error_code NUMBER := SQLCODE;
        error_msg  VARCHAR2(300) := SQLERRM;
      begin
        log_error(error_code, error_msg, v_program_sec, 'NEW');
      end;
  end;
end;```

for idx IN  1.. tab_names.COUNT
loop
  v_program_sec := 'Delete records from '||tab_names(idx)||' - INFC';
  EXECUTE IMMEDIATE 'delete from '||tab_names(idx)||' where pcy_policy_num = '||''''||infc_pol.policy_num||'''';
end loop;