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

BULKCOLLECTおよびFORALLを使用してPL/SQLをコンパイルできません

    FORALLを使用している場合、個々のフィールドを参照することはできません* -そのため、PLS-00436エラーが発生します。

    これを回避するには、連想配列を使用して個々のフィールドを参照する必要があります。

    DECLARE
    
        TYPE tt_rectype IS RECORD (
          referencekey tt.referencekey%TYPE,
          spid tt.spid%TYPE,
          nnsp tt.hiredate%TYPE,
          onsp tt.deptno%TYPE,
          portingtn tt.portingtn%TYPE);
    
        TYPE tt_aa_type
          IS TABLE OF TT_RECTYPE INDEX BY PLS_INTEGER;
    
        tt_aa TT_AA_TYPE;
        CURSOR cur_data IS
          SELECT *
          FROM   tt
          WHERE  ROWID IN (SELECT ROWID
                           FROM   (SELECT ROWID,
                                          Row_number () over (PARTITION BY portingtn
                                          ,
                                          nnsp
                                          , onsp,
                                          spid,
                                          Trunc(
                                                  createddate
                                          , 'MI') ORDER BY portingtn) dup
                                   FROM   tt)
                           WHERE  dup > 1);
    BEGIN
        OPEN cur_data;
    
        LOOP
            FETCH cur_data BULK COLLECT INTO tt_aa LIMIT 1000;
    
            FORALL i IN 1..tt_aa.COUNT
              INSERT INTO soa_temp_sv_refkey_fordelete
                          (referencekey,
                           spid,
                           nnsp,
                           onsp,
                           portingtn)
              (SELECT referencekey,
                      spid,
                      nnsp,
                      onsp,
                      portingtn
               FROM   tt
               WHERE  portingtn = Tt_aa(i).portingtn
                      AND spid = Tt_aa(i).spid
                      AND nnsp = Tt_aa(i).nnsp
                      AND onsp = Tt_aa(i).onsp
                      AND svid IS NULL);
    
            EXIT WHEN cur_data%notfound;
        END LOOP;
    
        CLOSE cur_data;
    
        COMMIT;
    END; 
    

    *この制限はOracle11g+には存在しないことに注意してください

    さらに、@ jonearles として コメント 、単一のSQLステートメントを使用できます。...

    INSERT INTO soa_temp_sv_refkey_fordelete
                (referencekey,
                 spid,
                 nnsp,
                 onsp,
                 portingtn)
    SELECT referencekey,
           spid,
           nnsp,
           onsp,
           portingtn
    FROM   tt
    WHERE  ROWID IN (SELECT ROWID
                     FROM   (SELECT ROWID,
                                    Row_number () over (PARTITION BY portingtn, nnsp
                                    , onsp,
                                    spid,
                                    Trunc(
                                            createddate
                                    , 'MI') ORDER BY portingtn) dup
                             FROM   tt)
                     WHERE  dup > 1); 
    



    1. Mysqlで2つの異なるテーブルを組み合わせて並べ替える方法

    2. 複数のテーブル、複数のGROUP BYおよびgroup_concatからのMySQLSELECT?

    3. djangoフィルターで以下または以上を行う方法は?

    4. トランザクションにSELECTを含める必要がありますか?