Oracle Apex
を使ったシステム開発、保守に携わりました。
Oracle Apex は Oracle が提供する Rad ツール兼実行環境です。開発者視点で見ますと、PL/SQL を使ってロジックを記述し、画面は Oracle Apex が用意する画面デザイナーを使ってサーバー側およびクライアント側を作りこみします。ドメイン駆動開発とは全く異なる開発スタイルと考えてよいでしょう。
CRUD だけであまりドメインロジックがない画面では素早く開発できますが、ドメインロジックが増えていくと難しいと感じました。Oracle、SQL、PL/SQL、Javascript の知識に加えて Oracle Apex の知識も必要となり、急に難易度が上がるように思いました。
画面制御では一般的な Javascript の知識に加えて、Oracle Apex 用の API を把握する必要があります。
業務で使ったことを機会に研究し、下記のような工夫をしました。
Javascript
- Proxy を使用して、Apex 項目に簡単にアクセスする方法を提供する。
- Apex の項目にアクセスするためには複雑な記述が必要で、行が増えがちですが Proxy によって Apex の項目をプロパティに持つオブジェクトを定義しました。この機能をはじめ、どの画面でも使える共通ルーチンは
Shared ComponentsStatic
/Application Files
にファイルとして格納しました。 - ajax送信するときにのパラメーターに x01, x02 等を使わないで
pageItems: ['P1_SEQ','P1_ITEM_CODE']
といった形式で指定する。 - pageItems でページに使用している項目を送信できます。クライアント側、サーバー側双方でパラメーター・項目間で詰めなおす必要がなくなります。
PL/SQL
PL/SQL に深く取り組んだのは初めてでした。いろいろと勉強になりました。SQL および PL/SQL で工夫した点を挙げます。
- 自己結合および EXISTS による同じテーブルを取得するサブクエリーを使わないで、分析関数を使う。
- パフォーマンス改善で効果があります。
- FROM 句等にサブクエリーをインラインで記述するのではなく共通テーブル式を使う。
- SQL 文が見やすくすっきりします。
- コンテキストスイッチを減らす。
- カーソルを使うと、Oracle エンジンと PL/SQL 間のコンテキストスイッチが頻繁に発生し、パフォーマンスを落とします。その対策として、可能であれば、BULK COLLECT を使ってコレクション型(ネストした表)に格納し、ネストした表を SQL で使ってロジックを実行するようにしました。
Oracle APEX で開発するなら下記サイトは必見です。