sql >> データベース >  >> RDS >> Oracle

ネストされたテーブル内に連想配列を入力します

    前の質問への回答で、%rowtypeを使用するとコレクションにデータを入力するのが難しくなると述べました 分野。私の知る限り、レコード型ではなくSQLレベルのオブジェクト型を宣言しない限り、bulk collectを使用することはできません。 このために(おそらく12cで変更されたかどうかを確認する価値があります)。

    タイプ内の2つのフィールド(つまり、%rowtype)を作成する単純なカーソルループを使用することに固執していると思います。 サブフィールドとrowid フィールド)を個別に作成し、コレクションを一度に1行ずつ作成します:

    create or replace package body dat_pkg is
    
        procedure transform_dat (p_batch_name data_test.batch_name%type)
        is
    
            cursor cur_dat is
            select rowid, a.*
            from   data_test a
            where  batch_name = p_batch_name;
    
            l_dat_tst typ_dat_tst;
            l_rec data_test%rowtype;
    
        begin
    
            for rec_dat in cur_dat loop
                l_rec.data_id := rec_dat.data_id;
                l_rec.data_value := rec_dat.data_value;
                l_rec.batch_name := rec_dat.batch_name;
                -- or use a counter you increment for this...
                l_dat_tst(l_dat_tst.count + 1).data_rec := l_rec;
                l_dat_tst(l_dat_tst.count).data_rowid := rec_dat.rowid;
            end loop;
    
            -- Do the Transformation here. Example --            
    
            for i in 1..l_dat_tst.count loop
                if l_dat_tst(i).data_rec.data_value = 'hello' then
                    l_dat_tst(i).data_rec.data_value := 'was hello';
                else            
                    l_dat_tst(i).data_rec.data_value := 'was not hello';
                end if;
            end loop;
    
            -- update the table            
            proc_test (p_dat => l_dat_tst);
    
        end transform_dat;
    
        procedure proc_test (p_dat  typ_dat_tst)
        is
        begin
    
            for i in 1..p_dat.count loop
    
                update  data_test        
                set     data_value  = p_dat(i).data_rec.data_value  
                where   data_id     = p_dat(i).data_rec.data_id
                and     rowid       = p_dat(i).data_rowid;
    
            end loop;
    
        end proc_test;
    
    end dat_pkg;
    /    
    

    前にも説明したように、サブフィールドレコードのフィールドへの参照は適切に修飾する必要があるため、.data_recを挿入しました。 両方の手順の参照で。 IDの代わりに値を変更するようにダミー変換を変更しました。これは、更新が行われないことを意味します。

    ダミーデータを使用したデモ:

    insert into data_test values (1, 'hello', 'test');
    insert into data_test values (2, 'hello', 'test');
    insert into data_test values (3, 'hello', 'exclude');
    insert into data_test values (4, 'goodbye', 'test');
    
    
    exec dat_pkg.transform_dat('test');
    
    select * from data_test;
    
       DATA_ID DATA_VALUE           BATCH_NAME          
    ---------- -------------------- --------------------
             1 was hello            test                
             2 was hello            test                
             3 hello                exclude             
             4 was not hello        test                
    



    1. 列から大文字の単語を検索するSQL

    2. データベース設計:口座残高の計算

    3. リクエストURLでテーブル名とフィールド名を公開する

    4. エラー:HHH000299:スキーマの更新を完了できませんでしたjava.lang.NullPointerException