tab  в этом куске кода...
                  
                  
                  или как тогда вывести все значения из динамики?
                  
                  
                  
                  
                  
                  
                  
                  
                   
                  
                  
                  declare  
                  
                  
                  type rec is record 
                  
                  
                             ( rule dwh.t_business_error.rule%type, 
                  
                  
                             --id dwh.t_business_error.id%type, 
                  
                  
                             field dwh.t_business_error.field%type, 
                  
                  
                             tab dwh.t_business_error.tab%type 
                  
                  
                            -- pr dwh.t_business_error.pr%type, 
                  
                  
                             
                  
                  
                              ); 
                  
                  
                  type l_tab is table of rec; 
                  
                  
                  l_col l_tab :=l_tab(); 
                  
                  
                   
                  
                  
                  v_sql varchar2(150):='case when substr(rolemask,1,1)=1 and taxcode is not null 
                  
                  
                  then 1 else 0 end'; 
                  
                  
                  p_cod integer; 
                  
                  
                  p_mess varchar2(4000); 
                  
                  
                  from_rule dwh.t_business_rule%rowtype;                   
                  
                  
                   
                  
                  
                   
                  
                  
                  begin  
                  
                  
                   
                  
                  
                  select * into from_rule from dwh.t_business_rule where id=1;  
                  
                  
                  dbms_output.put_line(from_rule.field||' '||from_rule.t_table);  
                  
                  
                   
                  
                  
                    execute immediate 'select  id, '||from_rule.field||'  from dwh.'||from_rule.t_table|| 
                  
                  
                    ' where '||v_sql||'=0 and trunc(sysdate)-1 between dt_beg and dt_exp 
                  
                  
                    and rownum<10' 
                  
                  
                    bulk collect into l_col; 
                  
                  
                     
                  
                  
                    l_col.extend; 
                  
                  
                    l_col(l_col.last).tab:=from_rule.t_table; 
                  
                  
                       
                  
                  
                    for i in l_col.first..l_col.last loop 
                  
                  
                      if l_col.exists(i) then  
                  
                  
                      dbms_output.put_line(l_col(i).rule||'   '||l_col(i).field) ;  
                  
                  
                      end if; 
                  
                  
                      end loop; 
                  
                  
                     
                  
                  
                      exception when others then  
                  
                  
                    p_cod :=sqlcode; 
                  
                  
                    p_mess  :=dbms_utility.format_error_stack||dbms_utility.format_error_backtrace;  
                  
                  
                    end;
                  
                  
                
т.к. кол-во элементов не соответствует, кол-ия само собой пустая. а мне надо присвоить таблицу в которой провожу проверку l_col(l_col.last).tab:=from_rule.t_table;
Понимаю. Суть в том, что в процедуре проверки я подаю правила из таблицы со скриптами на предмет качества данных, а ошибочные должны записать в другую таблицу. Проблему вызвала запись в коллекцию из динам. sql, поскольку как там вытянуть параметр таблицы с которой работаю. Получается, что в коллекцию записать поколоночно через инициализацию либо целиком через bulk collect, а тут динамический скл не даёт простора для манипуляций или я чего-то не знаю и все это делается иначе…
Костыль, конечно, но как вариант сделать таблицу буфер, в динамике инсертить в нее и потом в обычном pl\sql обрабатывать
в общем, мне лень разбираться, что у вас там происходит, но если вам нужно писать ошибочные данные по правилам, записанным в настроечную таблицу, то скорее всего вам нужно что-то типа такого: declare v_sql clob; begin v_sql := 'insert into errors select * from source where 1 != 1' for rule in (select * from rules) loop v_sql := ' or ' || rule.rule_text; end loop; -- нарушение любого из правил для каждой строки -- приведет к вставке в errors. execute immediate v_sql; commit; end; т.е. просто собрать по этим натсройкам sql, который будет фильтровать некорректные данные и вставлять их куда надо. потом выполнить.
Обсуждают сегодня