Курсор оракула, конкат с циклом - PullRequest
1 голос
/ 27 мая 2011

Я хочу использовать курсор для циклического прохождения цепочки управленческой отчетности с использованием Connect By Prior из Oracle. Затем порядок меняется на обратный, поэтому VP вверху, а запись, с которой я начал, внизу (A.Corpid).

вверху есть курсор C1, который извлекает труп, следуя определенным критериям

Каждое каноническое имя, возвращаемое из этой таблицы (скажем, если в нем 6 строк), которое я хочу сохранить в определенных переменных TIER1, TIER2, TIER3.

Почему-то я не могу понять, как объединить слово 'TIER' с номером строки i

DECLARE 
cursor c1 is
select distinct corpid, cn from Mytable where Country ='ITA';
master varchar2(50);
Tier1 varchar2(50);
Tier2 varchar2(50);
Tier3 varchar2(50);
Tier4 varchar2(50);
Tier5 varchar2(50);
Tier6 varchar2(50);
Tier7 varchar2(50);
Tier8 varchar2(50);
Begin
for rec in c1
loop
dbms_output.put_line(rec.cn);

   DECLARE 
   Cursor C2 is

    SELECT CN  FROM Mytable A CONNECT BY PRIOR A.reportsto=A.corpid 
    START WITH A.corpid=rec.corpid
    order by rownum desc;

        Begin
        open C2;
        for i in 1..8 loop
            fetch C2 into master;
            dbms_output.put_line(master);
              'Tier'||to_char(i)) :=master ;  
            end loop;
            end;

     if TIER1 is null then
    TIER1:='';
    end if;
*/ remmed out until the variable assignments work */
-- update mytable set VP_TIER1=TIER1 where corpid=rec.corpid; 
end loop;
end;

Оракул жалуется на '||'

(ORA-06550: строка 33, столбец 31: PLS-00103: обнаружен символ "|" при ожидании одного из следующих: знак равно (@%; )


Я тоже пытался примириться, но это тоже не сработало

ORA-06550: строка 33, столбец 26: PLS-00306: неверный номер или типы аргументов при вызове 'CONCAT'

1 Ответ

1 голос
/ 27 мая 2011

Ваша конкатенация литерала и переменной не будет вычисляться для переменной TIER1, как вы надеетесь. Попробуйте вместо этого использовать массивы:

DECLARE  
    cursor c1
    is 
        select distinct corpid, cn
        from Mytable where Country ='ITA'; 
        master varchar2(50);
        TYPE Tier_arr_t IS TABLE OF VARCHAR2(50) INDEX BY PLS_INTEGER;
        Tier_arr TIER_ARR_T;  
Begin 
    for rec in c1 
    loop 
        dbms_output.put_line(rec.cn);

        DECLARE
            Cursor C2
            is
                SELECT CN 
                FROM Mytable A
                CONNECT BY PRIOR A.reportsto=A.corpid      
                START WITH A.corpid=rec.corpid     
                order by rownum desc;
        Begin
             open C2;

             for i in 1..8
             loop              
                  fetch C2 into master;
                  dbms_output.put_line(master);
                  Tier_arr(i) :=master ;
             end loop;
        end;

        if TIER1 is null
        then
              TIER1:='';
        end if;
        update mytable set VP_TIER1=Tier_arr(1), VP_TIER2=Tier_arr(2) where corpid=rec.corpid;
    end loop;  
end; 

Существует также, вероятно, более подход, основанный на множестве, для этого, который был бы намного предпочтительнее, но это должно работать, если это просто разовая необходимость.

...