суббота, 15 февраля 2020 г.

Исполняемый блок SQL с итерациями по ID

DECLARE
    c integer := 0;
    find_s varchar(15) := 'ORGACC_IDS="';
    accstr varchar(32767);
    ac_id integer;
    acc_num varchar2(35);
    tmp1_acc_cnt integer := 0;
    o_inn varchar2(20);
    o_name varchar2(255);
CURSOR crsr is
    select
    r.id,
    r.DOC_NUMBER,
    t.CAPTION,
    INSTR(r.PARAMS,find_s)+12 as START_TAG,
    INSTR(r.PARAMS,'"',INSTR(r.PARAMS,find_s)+12+1) as END_TAG,
    ((INSTR(r.PARAMS,'"',INSTR(r.PARAMS,find_s)+12+1))-(INSTR(r.PARAMS,find_s)+12)) as TAG_LEN,
    SUBSTR(r.PARAMS,INSTR(r.PARAMS,find_s)+12,((INSTR(r.PARAMS,'"',INSTR(r.PARAMS,find_s)+12+1))-(INSTR(r.PARAMS,find_s)+12))) as ACC_STR,
    regexp_count(SUBSTR(r.PARAMS,INSTR(r.PARAMS,find_s)+12,((INSTR(r.PARAMS,'"',INSTR(r.PARAMS,find_s)+12+1))-(INSTR(r.PARAMS,find_s)+12))),',')+1 as ACC_CNT
    from PBSREPTEMPLATE r join PBSREPTYPE t on t.id=r.PBSREPTYPE_ID
    /* where r.BUDGET_ID in () */ /* where r.id in (800000001851) - для проверки на одном шаблоне */;
BEGIN
    dbms_output.put_line('ID'||chr(09)||'Номер'||chr(09)||'Тип'||chr(09)||'Счет'||chr(09)||'ИНН'||chr(09)||'Организация');
    FOR s in crsr LOOP
        accstr := s.ACC_STR;
        FOR i in 1..s.ACC_CNT LOOP /* Разбираем строку с перечислением ID счетов на отдельные части */
            c := INSTR(accstr,',');
            ac_id := SUBSTR(accstr,1,c-1);
            accstr := SUBSTR(accstr,c+1,s.TAG_LEN);
            if i = s.ACC_CNT then ac_id := accstr; end if; /* Если итерация крайняя, то выводим остаток строки с перечислением ID счетов, там как раз остается крайний счет */
            select count(*) into tmp1_acc_cnt from orgaccount where close_date is null and id = ac_id;
            if tmp1_acc_cnt = 0 then continue; end if; /* Если счет закрыт, то вывод инфы пропускаем */
            select ACCOUNT_NUMBER into acc_num from orgaccount where close_date is null and id = ac_id;
            select o.taxcode, o.caption into o_inn, o_name from org o where exists (select null from orgaccount oa where oa.ORG_ID=o.id and oa.id = ac_id);
            dbms_output.put_line(s.id||chr(09)||trim(s.DOC_NUMBER)||chr(09)||s.CAPTION||chr(09)||acc_num||chr(09)||o_inn||chr(09)||o_name);
        END LOOP;
    END LOOP;
END;

Комментариев нет:

Архив