4.15 ループのGeoRasterオブジェクトの更新

複数のGeoRasterオブジェクトを更新する場合、通常カーソルが使用されます。ただし、ループのGeoRaster操作がパラレル化可能であるか、各UPDATE文の実行後にCOMMIT文が実行される場合、カーソルのSQL問合せには、ループ内のコミットでFOR UPDATE句を使用したカーソルが無効になるため、FOR UPDATE句を使用できません。

例4-5 パラレル処理を有効化したループのGeoRasterオブジェクトの更新

次の例では、ピラミッドが表のすべてのGeoRasterオブジェクトに生成されました。各更新の実行後に明示的なコミットが実行され、SDO_GEOR.generatePyramidプロシージャのパラレル処理が有効化されます(parallel=4)。FOR UPDATE句を使用したGeoRasterオブジェクトの問合せは、カーソル問合せ文ではなくループ内で実行されます。

DECLARE
    gr1 sdo_georaster;
BEGIN
    FOR rec in (SELECT georid FROM georaster_table ORDER BY georid) LOOP
      SELECT georaster INTO gr1 FROM georaster_table WHERE georid=rec.georid FOR UPDATE;
      sdo_geor.generatePyramid(gr1, 'rlevel=5, resampling=bilinear', null, 'parallel=4');
      UPDATE georaster_table SET georaster=gr1 WHERE georid=rec.georid;
      COMMIT;
    END LOOP;
 END;
/

例4-6 パラレル処理を有効化しないループのGeoRasterオブジェクトの更新

ループのGeoRaster操作が(この例で示されているように)パラレル化可能でない場合、各更新の実行後にCOMMITを実行するかわりに、FOR UPDATE句を使用したカーソルの無効化を回避するため、カーソル・ループの外部でCOMMIT文を実行できます。例ではNODATAを表のすべてのGeoRasterオブジェクトに追加することにも注意してください。

BEGIN
FOR rec in (SELECT georid, georaster FROM georaster_table FOR UPDATE)
    LOOP
      sdo_geor.addNODATA(rec.georaster, 0, 0);
      UPDATE georaster_table SET georaster=rec.georaster 
        WHERE georid=rec.georid;
END LOOP;
COMMIT;
 END;
/