1

我想使用游标来循环使用 Oracle 的 Connect By Prior 的管理报告链。然后颠倒顺序,因此 VP 位于顶部,而我开始的记录位于底部 (A.Corpid)。

顶部有一个光标 C1,它按照某些标准检索 corpid

从该表返回的每个规范名称(比如它有 6 行)我想存储在定义的 TIER1、TIER2、TIER3 变量中。

不知何故,我不知道如何将“TIER”这个词与我的行号结合起来

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;

Oracle 抱怨 '||'

(ORA-06550:第 33 行,第 31 列:PLS-00103:在预期以下情况之一时遇到符号“|”::=。(@%;)


我也尝试过 concat 但这也不起作用

ORA-06550:第 33 行,第 26 列:PLS-00306:调用“CONCAT”时参数的数量或类型错误

4

1 回答 1

1

您的文字和变量的连接不会像您希望的那样评估为变量 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; 

可能还有一种更基于集合的方法来执行此操作,这将是更可取的,但如果它只是一次性需要,这应该可以工作。

于 2011-05-26T21:38:45.110 回答