1

Oracle の Connect By Prior を使用して、カーソルを使用して管理レポート チェーンをループしたいと考えています。次に順序が逆になるため、VP が一番上にあり、開始したレコードが一番下になります (A.Corpid)。

上部にカーソル C1 があり、特定の基準に従って corpid を取得します

そのテーブルから返された各正規名 (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' の呼び出しで引数の数または型が間違っています

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; 

これを行うためのよりセットベースのアプローチもおそらくありますが、これは1回限りの必要性である場合は、機能するはずです。

于 2011-05-26T21:38:45.110 に答える