2023年4月7日金曜日

PGQLを使ったAPEXアプリを23cのSQL Property Graphで置き換えてみる

PGQLをトランスレートして生成したSQLをレポートのソースとした、Oracle APEXのアプリケーションを作成したことがあります。

PGQLの2層モードで生成されるSQLをAPEXのレポートに組み込む

Oracle Database 23cよりSQL/PGQ(Property Graph Queries)がサポートされ、グラフ形式のデータを直接扱うことができるようになりました。

以前の記事で作成したAPEXアプリケーションを、SQL/PGQを使うように見直してみます。

使用するのはこちらの記事で作成した、Oracle Database 23c FreeにOracle APEX 22.2をインストールした環境です。Oracleが提供しているVirtualBoxのAPEXを日本語化した環境でも同様に作業ができるでしょう。

ワークスペースとしてAPEXDEV(紐づいているスキーマもAPEXDEV)が作成されていることを前提とします。ワークスペースやスキーマ名が異なる場合は、APEXDEVの部分を置き換えてください。

最初にスキーマAPEXDEVにSQL Property Graphを扱う権限を与えます。

4.1.5 Granting System and Object Privileges for SQL Property Graphs
GRANT CREATE PROPERTY GRAPH, CREATE ANY PROPERTY GRAPH, 
      ALTER ANY PROPERTY GRAPH, DROP ANY PROPERTY GRAPH, 
      READ ANY PROPERTY GRAPH TO APEXDEV;

ユーザーsystemで接続し、スキーマAPEXDEVに権限を与えます。

[oracle@apex ~]$ sqlplus system/********@localhost/freepdb1


SQL*Plus: Release 23.0.0.0.0 - Developer-Release on Fri Apr 7 15:34:54 2023

Version 23.2.0.0.0


Copyright (c) 1982, 2023, Oracle.  All rights reserved.


Last Successful login time: Fri Apr 07 2023 15:34:44 +09:00


Connected to:

Oracle Database 23c Free, Release 23.0.0.0.0 - Developer-Release

Version 23.2.0.0.0


SQL> GRANT CREATE PROPERTY GRAPH, CREATE ANY PROPERTY GRAPH, 

      ALTER ANY PROPERTY GRAPH, DROP ANY PROPERTY GRAPH, 

      READ ANY PROPERTY GRAPH TO APEXDEV;  2    3  


Grant succeeded.


SQL> exit

Disconnected from Oracle Database 23c Free, Release 23.0.0.0.0 - Developer-Release

Version 23.2.0.0.0

[oracle@apex ~]$ 


元記事ではSQLclでPGQLを使用するために、色々な作業を行っています。SQL Property Graphを使う場合は、これらの作業は不要です。

以下のSQLを実行し、頂点であるアカウントとエッジであるトランザクションを保存する表を作成します。表SQLCL_BANK_ACCTS、SQLCL_BANK_TXNSは元記事とまったく同じ表です。



作成した表にテスト・データを投入するために、ユーティリティデータ・ジェネレータを使用します。

データ・ジェネレータでの作業も元記事とまったく同じです。同じ手順を記載するのは冗長になるため、テスト・データの準備については元記事を参照してください。


データ・ジェネレータによるテスト・データの投入が完了したところから継続します。

SQLコマンドより、表SQLCL_BANK_ACCTSに投入されたデータを確認します。

select count(*) from sqlcl_bank_accts;


SQLCL_BANK_TXNSに投入されたデータを確認します。

select count(*) from sqlcl_bank_txns;


テスト・データより、送金元と送金先が同じ行を削除します。

delete from sqlcl_bank_txns where from_acct_id = to_acct_id;


以上でテスト・データの準備が完了しました。

この表を元にプロパティ・グラフSQLCL_BANK_GRAPHを作成します。



元記事で作成したAPEXアプリケーションをインポートします。
https://github.com/ujnak/apexapps/blob/master/exports/pgql-reports.zip

インポートしたアプリケーションを編集します。

ページ番号2のPGQL1のレポートのソースを以下に変更します。
select acct_id, count(*) as NumDeposits
from graph_table(sqlcl_bank_graph
    match
    (m is account) -[e is transfer] ->(v is account)
    columns (v.acct_id)
)
group by acct_id
order by NumDeposits desc
fetch first :P2_ROWS rows only;

ページを実行すると、以下のように表示されます。


PGQLより生成したSQLをSQL/PGQを使うように置き換えます。マニュアルの主な参照箇所は以下になります。

5 SQL GRAPH_TABLE Queries

ページ番号3のPGQL2のレポートのソースは、以下に変更します。
select from_acct_id, amount, to_acct_id, description
from graph_table(sqlcl_bank_graph
    match
    (s is account where s.acct_id member of apex_string.split_numbers(:P3_ACCT_IDS,',')) -[e is transfer]->(d is account)
    columns (s.acct_id as from_acct_id, e.amount as amount, d.acct_id as to_acct_id, e.description as description)
);

ページを実行すると、以下のように表示されます。


 PGQLからSQLを生成してレポートに組み込むより、はるかに簡単にグラフ構造のデータを活用できるようになっています。

現時点(バージョン22.2)のOracle APEXには、グラフを描画する標準のコンポーネントはありません。地理空間情報に対応しているマップ・リージョンのように、グラフ構造のデータについても専用のリージョンが提供されると、もっとグラフの使い勝手が良くなることが期待されます。

今回の変更を加えたAPEXアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/sqlpgq-report.zip

Oracle APEXのアプリケーション作成の参考になれば幸いです。

Oracle AI Database 26ai Free VirtualBox ApplianceでOracle APEXを使う

更新: 2026年1月30日

Oracle AI Database 26ai Freeは、VirutalBoxの仮想マシンとしても提供されています。

ダウンロード

以下が概要になります。
  • Oracle Linux 8.10
  • Oracle AI Database 23.26
  • Oracle REST Data Services 25.3
  • Oracle SQLcl 25.3
  • Oracle APEX 24.2
  • JDK 21.0.5
上記の仮想マシンをダウンロードした後、VirtualBox(今回使用したバージョンは7.2.4)にインポートして起動し、Oracle APEXの使い勝手を確認してみました。x86_64しかないため、ARMに移行しているMacユーザーは利用できません。また、残念なことにAPEXは日本語化されていませんでした。

以下より、日本語リソースをロードする方法を紹介します。手順自体は、一般的なOracle APEXの言語リソースのロード作業です。

ダウンロードしたOracle_AI_Database_26ai_Free.ovaをVirtualBoxにインポートした直後の状態から作業を始めます。

インポートした仮想マシンを起動すると、データベースとORDSも同時に起動します。ディスプレイ表示倍率を上げると、コンソールが広くなります。


ターミナルも開きますが、私の環境ではキーマップが異なり、この画面のターミナルからの作業は今ひとつでした。コンソールの外からコピぺもできません。


ネットワークポートフォワーディングの設定を確認すると、sshのポートがホストの2223に割り当てられています。


なので、ローカルのマシンのターミナルからSSHで接続し、作業をすることにします。

ssh -p 2223 oracle@localhost

~ % ssh -p 2223 oracle@localhost         

The authenticity of host '[localhost]:2223 ([127.0.0.1]:2223)' can't be established.

ED25519 key fingerprint is SHA256:KAd6f3AsAB7inP+X63xYLJWQckmqPyORYKDipVgSPCk.

This key is not known by any other names.

Are you sure you want to continue connecting (yes/no/[fingerprint])? yes

Warning: Permanently added '[localhost]:2223' (ED25519) to the list of known hosts.

oracle@localhost's password: ********

Activate the web console with: systemctl enable --now cockpit.socket


Last login: Fri Jan 30 01:44:23 2026

[oracle@localhost ~]$ 


仮想マシンにはOracle APEXの言語リソースが含まれていません(/home/oracle/apex以下にbuilderが含まれていない)。インストールされているOracle APEXのバージョンは24.2であるため、以下のリンクより日本語リソースを含んだアーカイブをダウンロードします。

mkdir temp
cd temp
curl -OL https://download.oracle.com/otn_software/apex/apex_24.2.zip

[oracle@localhost ~]$ mkdir temp

[oracle@localhost ~]$ cd temp

[oracle@localhost temp]$ curl -OL https://download.oracle.com/otn_software/apex/apex_24.2.zip

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current

                                 Dload  Upload   Total   Spent    Left  Speed

100  289M  100  289M    0     0  6443k      0  0:00:45  0:00:45 --:--:-- 5718k

[oracle@localhost temp]$ 


ダウンロードしたapex_24.2.zipを解凍します。

unzip -q apex_24.2.zip
ls apex

[oracle@localhost temp]$ unzip -q apex_24.2.zip 

[oracle@localhost temp]$ ls apex

LICENSE.txt                 apxdevrm_cdb.sql    apxrtins_cdb.sql

apex_rest_config.sql        apxdevrm_nocdb.sql  apxrtins_nocdb.sql

apex_rest_config_cdb.sql    apxdvins.sql        apxsilentins.sql

apex_rest_config_core.sql   apxdvins_cdb.sql    builder

apex_rest_config_nocdb.sql  apxdvins_nocdb.sql  core

apexins.sql                 apxdwngrd.sql       coreins.sql

apexins1.sql                apxpatch.sql        coreins2.sql

apexins2.sql                apxpatch_cdb.sql    coreins3.sql

apexins3.sql                apxpatch_nocdb.sql  coreins4.sql

apexins_adb.sql             apxremov.sql        coreins5.sql

apexins_adb_ext.sql         apxremov1.sql       dbcsconf.sql

apexins_cdb.sql             apxremov2.sql       dbcsins.sql

apexins_nocdb.sql           apxremov_cdb.sql    devins.sql

appins.sql                  apxremov_nocdb.sql  images

apxappcon.sql               apxrtins.sql        load_trans.sql

apxappcon_ext.sql           apxrtins1.sql       utilities

apxchpwd.sql                apxrtins2.sql

apxdevrm.sql                apxrtins3.sql

[oracle@localhost temp]$ 


日本語リソースをロードします。

cd apex
. oraenv   (ORACLE_SIDとしてFREEを指定)
export NLS_LANG=American_America.AL32UTF8
sqlplus sys/******@localhost/freepdb1 as sysdba
@load_trans JAPANESE

[oracle@localhost temp]$ cd apex

[oracle@localhost apex]$ . oraenv

ORACLE_SID = [oracle] ? FREE

The Oracle base has been set to /opt/oracle

[oracle@localhost apex]$ export NLS_LANG=American_America.AL32UTF8

[oracle@localhost apex]$ sqlplus sys/********@localhost/freepdb1 as sysdba


SQL*Plus: Release 23.26.0.0.0 - Production on Fri Jan 30 01:59:08 2026

Version 23.26.0.0.0


Copyright (c) 1982, 2025, Oracle.  All rights reserved.



Connected to:

Oracle AI Database 26ai Free Release 23.26.0.0.0 - Develop, Learn, and Run for Free

Version 23.26.0.0.0


SQL> @load_trans JAPANESE


PL/SQL procedure successfully completed.


Installing Oracle APEX translation - JAPANESE


. ORACLE

.

. Oracle APEX Hosted Development Service Installation.

..............................................................


PL/SQL procedure successfully completed.



PL/SQL procedure successfully completed.


--application/set_environment

API Last Extended:20241130

Your Current Version:20241130

This import is compatible with version: 20241130

COMPATIBLE (You should be able to run this import without issues.)

ID offset during import: 0

New ID offset for application: 0

APPLICATION 4420 - Oracle APEX Builder, Wizard Messages and Native Plug-Ins

--application/delete_application

--application/create_application

--application/user_interfaces


[中略]


--application/deployment/definition

--application/deployment/checks

--application/deployment/buildoptions

--application/end_environment

... elapsed: 5.87 sec

...done

Adjust instance settings


PL/SQL procedure successfully completed.


SQL> 


プロンプトが返ってきた時点で日本語リソースの導入は完了しています。

APEXの管理サービスには、以下のURLからアクセスできます。


日本語リソースを導入しているため、言語として日本語を選択できます。管理者のユーザー名はADMINです。パスワードは仮想マシンのコンソールで開いているWebページまたはターミナルに記載されています。


管理にサインインできます。


APEXのワークスペースとして、HR_DEVが作成済みです。ユーザーHR_ADMINでサインインできます。パスワードは仮想マシンのコンソールで開いているWebページまたはターミナルに記載されています。



APEXのアプリケーション・ビルダーが開きます。


データベース・アクション(SQL Developer Web)への接続も確認します。

http://localhost:8080/ords/sql-developer

詳細をクリックし、パス指定を開きます。

SQL Developer Webでは、ユーザーHRがあらかじめ作成されています。パスhrユーザー名hrにてサインインできます。


SQL Developer Webが開きます。


以上で、Oracle APEXのアプリケーションを開発する準備ができました。