作成するAPEXアプリケーションは以下のように動作します。
以下のページから海面水温のデータをダウンロードします。日本の気象庁(Japanese Mateorolgical Center)から提供されているデータセットです。今回は1850/01から2025/08の間の月次平均のデータを使用します。アプリケーションを作った後に気づきましたが、年次のデータの方が季節単位の変動がグラフに現れないので、トレンドを見るのには向いているでしょう。
上記のサイトからsst.mon.mean.ncをダウンロードします。ファイルのフォーマットはNetCDF4という形式です。
NetCDF4という形式は初めて聞きました。NetCDF4をOracle Databaseに直接ロードする方法はないので、一般的なCSVに変換する方法をClaude Sonnet 4に聞いてみました。
色々な方法が提示されましたが、その中でcdo - Climate Data OperatorsというツールでCSVに変換するのが一番簡単そうだったので、それを使うことにします。
sst % brew install cdo
==> Downloading https://formulae.brew.sh/api/formula.jws.json
==> Downloading https://formulae.brew.sh/api/cask.jws.json
Warning: cdo 2.5.3 is already installed and up-to-date.
To reinstall 2.5.3, run:
brew reinstall cdo
sst %
cdo outputtab,date,lon,lat,value -sellonlatbox,120,150,20,50 sst.mon.mean.nc > sst_japan_region.csv
sst % cdo outputtab,date,lon,lat,value -sellonlatbox,120,150,20,50 sst.mon.mean.nc > sst_japan_region.csv
sst %
head -5 sst_japan_region.csv
sst % head -5 sst_japan_region.csv
# date lon lat value
1850-01-01 120.5 49.5 1e+20
1850-01-01 121.5 49.5 1e+20
1850-01-01 122.5 49.5 1e+20
1850-01-01 123.5 49.5 1e+20
sst %
while read date lon lat value
do
echo $date,$lon,$lat,$value
done < sst_japan_region.csv > sst_japan.csv
sst % while read date lon lat value
do
echo $date,$lon,$lat,$value
done < sst_japan_region.csv > sst_japan.csv
sst %
head -5 sst_japan.csv
SQLclのloadコマンドでロードできるCSVの形式に変わりました。
sst % head -5 sst_japan.csv
date,lon,lat,value
1850-01-01,120.5,49.5,1e+20
1850-01-01,121.5,49.5,1e+20
1850-01-01,122.5,49.5,1e+20
1850-01-01,123.5,49.5,1e+20
sst %
今回は1回限りの作業なので、手作業でCSVファイルを変換しました。
sst % sql -cloudconfig ../Wallets/Wallet_APEXDEV.zip wksp_apexdev@apexdev_low
SQLcl: 木 9月 04 11:45:52 2025のリリース25.2 Production
Copyright (c) 1982, 2025, Oracle. All rights reserved.
パスワード (**********?) **************
接続先:
Oracle Database 23ai Enterprise Edition Release 23.0.0.0.0 - for Oracle Cloud and Engineered Systems
Version 23.9.0.25.08
SQL>
create table sst_data (
observation_date date not null,
longitude number not null,
latitude number not null,
value number not null
);
SQL> create table sst_data (
2 observation_date date not null,
3 longitude number not null,
4 latitude number not null,
5 value number not null
6* );
Table SST_DATAは作成されました。
SQL>
set load map_column_names (date=OBSERVATION_DATE,lon=LONGITUDE,lat=LATITUDE,value=VALUE)
set load batch_rows 100000
SQL> set load date_format YYYY-MM-DD
SQL> set load map_column_names (date=OBSERVATION_DATE,lon=LONGITUDE,lat=LATITUDE,value=VALUE)
SQL> set load batch_rows 100000
SQL>
SQL> show load
batch_rows 100000
batches_per_commit 10
clean_names transform
column_size rounded
commit on
date_format YYYY-MM-DD
errors 50
map_column_names (date=OBSERVATION_DATE, lon=LONGITUDE, value=VALUE, lat=LATITUDE)
method insert
timestamp_format
timestamptz_format
locale
scan_rows 100
truncate off
unknown_columns_fail on
SQL>
ファイルsst_japan.csvを表SST_DATAにロードします。経過時間を表示するため、timingをonにしています。
load sst_data ./sst_japan.csv
SQL> set timing on
SQL> load sst_data ./sst_japan.csv
csv
column_names on
delimiter ,
enclosures ""
double
encoding UTF8
row_limit off
row_terminator default
skip_rows 0
skip_after_names
データを表にロードします WKSP_APEXDEV.SST_DATA
batch_rows 100000
batches_per_commit 10
clean_names transform
column_size rounded
commit on
date_format YYYY-MM-DD
errors 50
map_column_names (date=OBSERVATION_DATE, lon=LONGITUDE, value=VALUE, lat=LATITUDE)
method insert
timestamp_format
timestamptz_format
locale 日本語 日本
scan_rows 100
truncate off
unknown_columns_fail on
#INFO 処理された行数: 1,897,200
#INFO エラーのある行数: 0
#INFO 最後にコミットされたバッチで処理された最後の行: 1,897,200
成功: エラーなしで処理されました
合計経過時間: 00:00:34.343
SQL>
表SST_DATAに主キー列IDを追加します。主キーを自動採番にしていますが、SQLclのloadコマンドでは自動採番の主キー列があるとデータをロードできません(NOT NULL列には必ず値を割り当てる必要があります)。そのため、データをアップロード後に主キー列を追加しています。
alter table sst_data add id number generated by default as identity primary key;
SQL> alter table sst_data add id number generated by default as identity primary key;
Table SST_DATAが変更されました。
経過時間: 00:01:15.300
SQL>
海面水温の計測地点の座標は点として与えられていますが、APEXのマップ・リージョンでは矩形のヒートマップとして表示したいので、これを矩形のジオメトリに変換します。
alter table sst_data add (square sdo_geometry);
SQL> alter table sst_data add (square sdo_geometry);
Table SST_DATAが変更されました。
経過時間: 00:00:00.327
SQL>
update sst_data set square = sdo_geometry(
2003, 4326, null, sdo_elem_info_array(1,1003,3),
sdo_ordinate_array(
floor(longitude), floor(latitude),
ceil(longitude), ceil(latitude)
)
);
commit;
SQL> update sst_data set square = sdo_geometry(
2 2003, 4326, null, sdo_elem_info_array(1,1003,3),
3 sdo_ordinate_array(
4 floor(longitude), floor(latitude),
5 ceil(longitude), ceil(latitude)
6 )
7* );
1,897,200行更新しました。
経過時間: 00:01:39.085
SQL> commit;
コミットが完了しました。
経過時間: 00:00:00.220
SQL>
select observation_date d, observation_date r from sst_data
group by observation_date order by observation_date desc
observation_date = :P1_OBSERVATION_DATE and value < 100
経度: &LONGITUDE.<br>
緯度: &LATITUDE.<br>
温度: &VALUE.