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; /
親トピック: GeoRasterのデータ問合せおよび操作