PL/SQL

【PL/SQL】ジョブ実行履歴の集中管理と異常検知(DBMS_SCHEDULER+ロギング)

ジョブを安定運用するうえで最も重要なのは「いつ・何が・どれくらい動いて・成功か失敗か・遅延や長時間化はないか」を一元的に把握できることだ。DBMS_SCHEDULERはデフォルトでも実行履歴ビューを提供するが、アプリ都合の識別子やSLA、入...
PL/SQL

【PL/SQL】トランザクション分離レベル別の一貫性テストと検証パターン

Oracleのトランザクション分離は「一貫性読取」を前提としたMVCC(Multi-Version Concurrency Control)で実装され、既定のREAD COMMITTEDは文単位、SERIALIZABLEとREAD ONLY...
PL/SQL

【PL/SQL】パッケージ間依存を可視化するメタデータ解析(ALL_DEPENDENCIES活用)

パッケージを中心に巨大化したPL/SQLコードベースでは、どのパッケージがどれに依存しているのか、どこを直すとどこが壊れるのかを即座に可視化できることが品質とスピードの両立に直結する。Oracleは依存関係をディクショナリに保持しており、A...
PL/SQL

【PL/SQL】性能診断のための実行計画・統計情報の収集と分析

SQLが遅いと感じたとき、やみくもにインデックスを増やすのではなく、「実行計画」「実行時統計」「オプティマイザ統計」の三点を正しく採取・照合して原因を特定するのが最短です。この記事では、EXPLAIN PLANだけで終わらせない実務的な診断...
PL/SQL

【PL/SQL】コードデプロイの自動化とEdition管理(CI/CD連携)

継続的インテグレーション/継続的デリバリの流れにPL/SQLのコードデプロイを組み込むなら、Edition-Based Redefinition(EBR)の採用が最短距離です。EBRは“Edition”という論理的な実行空間を並行稼働させ、...
PL/SQL

【PL/SQL】テスト容易性を高めるプロシージャ設計とモック化手法

ビジネスロジックを確実に自動テストするには、「外部依存(時刻・メール・HTTP・シーケンス・ファイル・権限)を分離して差し替え可能にする」ことが要点です。PL/SQLでもポート/アダプタ発想・薄いファサード・依存の抽象化(インターフェース)...
PL/SQL

【PL/SQL】DBMS_PARALLEL_EXECUTEによる大規模バッチの並列化戦略

大規模なテーブル更新や集計処理では、単一セッションで全件を処理するとUNDOやREDOが膨張し、実行時間が数時間に達することも珍しくありません。OracleのDBMS_PARALLEL_EXECUTEを使えば、処理をチャンク単位に分割し、複...
PL/SQL

【PL/SQL】マルチセッション環境での排他・同時実行制御の高度設計

大規模なOracle/PLSQLシステムでは、複数セッションが同じデータ資源へ同時にアクセスし続けます。思いつきのロック取得や場当たり的な再試行では、デッドロックやスループット低下、待機時間の増大を招きます。ここでは、行ロックと表ロックの前...
PL/SQL

【PL/SQL】例外をJSON形式で返すREST対応API設計

REST対応のPL/SQLでは、失敗時に例外をそのままエラーとして投げ返すのではなく、クライアントが機械的に解釈できるJSONの形に正規化して返す設計が重要になります。業務エラーと一時的障害を区別し、再試行可否や相関IDを含む共通スキーマで...
PL/SQL

【PL/SQL】仮想列(Virtual Column)とトリガーを使った自動整合設計

データの一貫性をアプリ任せにすると、更新漏れや整合崩れが必ず起きます。Oracleでは「仮想列(Virtual Column)」と「トリガー(Trigger)」を組み合わせることで、導出値や監査項目、正規化の補助列をデータベース側で自動生成...
PL/SQL

【PL/SQL】Result Cacheとマテリアライズドビューを併用した高速化戦略

Result Cacheとマテリアライズドビュー(MV)はどちらも「繰り返し同じ結果を返す処理を前計算または再利用で速くする」ための仕組みですが、効くレイヤーと無効化の条件が異なります。MVはSQL結果を物理表として保持し、更新ポリシーで鮮...
PL/SQL

【PL/SQL】大規模システムでの例外設計と再試行パターン

大規模なPL/SQLシステムでは、例外設計が品質と運用負荷を大きく左右します。単にWHEN OTHERSで握ってログを残すだけでは、原因の切り分けも再試行戦略も立てられません。望ましいのは、例外の性質を分類し、再試行の可否とロールバック範囲...
PL/SQL

【PL/SQL】インストゥルメンテーション設計とログトレース手法

大規模なPL/SQLシステムでは、障害対応や性能解析を行う際に「どの処理が」「どのタイミングで」「どのような入力で」実行されたのかを可視化することが重要です。そのために欠かせないのが、インストゥルメンテーション(Instrumentatio...
PL/SQL

【PL/SQL】カスタム集計関数(User Defined Aggregate)の作り方

Oracle Databaseでは、標準のSUMやAVGなどに加えて、独自の集計ロジックを持つ「ユーザー定義集計関数(User Defined Aggregate, UDA)」を作成できます。PL/SQLオブジェクト型を利用することで、任意...
PL/SQL

【PL/SQL】権限分離とセキュリティパッケージ(Invoker Rights活用例)

アプリケーションの安全性と最小権限の原則を両立させるには、スキーマ分離とPL/SQLのInvoker Rights(AUTHID CURRENT_USER)を軸にした「セキュリティパッケージ」設計が有効です。業務データを持つ実体スキーマと、...
PL/SQL

【PL/SQL】依存オブジェクトとINVALID再コンパイルの制御

PL/SQLの変更をデプロイすると、依存関係の連鎖によってオブジェクトがINVALID化し、次の実行時に再コンパイルが走ることがあります。無秩序なINVALIDは初回実行の遅延や予期せぬ失敗を招くため、依存の把握と再コンパイルの制御を設計に...
PL/SQL

【PL/SQL】メモリとカーソルの効率的な管理(カーソルキャッシュの仕組み)

大量トランザクションや動的SQLが多いPL/SQLでは、「パースをどれだけ避けてカーソルを再利用できるか」と「開いたカーソルを漏らさず閉じられるか」が性能と安定性を左右します。Oracleはライブラリキャッシュとセッションのカーソルキャッシ...
PL/SQL

【PL/SQL】大量データの一括処理におけるコミット頻度とUNDO最適化

大量データを一括処理するPL/SQLでは、コミット頻度の設計とUNDOの最適化が性能と安定性の成否を分けます。コミットを細かく刻みすぎればオーバーヘッドと断片化が増え、粗すぎればUNDO不足やロールバック時のダメージが大きくなります。ここで...
PL/SQL

【PL/SQL】データ整合性を保証するトランザクション設計パターン

ビジネスルールを確実に守りつつ高いスループットを出すには、単にCOMMIT/ROLLBACKを呼ぶだけでは不十分で、要件に応じてトランザクションの粒度・ロック・再試行・冪等性などを設計する必要があります。ここではOracle/PLSQLで実...
PL/SQL

【PL/SQL】オブジェクト型とメソッドを使ったオブジェクト指向設計

PL/SQLでもオブジェクト指向的な設計が可能であり、`OBJECT TYPE`を利用することでデータ構造とメソッドをひとつにまとめた「カプセル化」を実現できます。特に業務ロジックをデータごとに振る舞いとして表現したい場合や、再利用性の高い...