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`を利用することでデータ構造とメソッドをひとつにまとめた「カプセル化」を実現できます。特に業務ロジックをデータごとに振る舞いとして表現したい場合や、再利用性の高い...
PL/SQL

【PL/SQL】パッケージ仕様と本体の分離設計による保守性向上

大規模なPL/SQL開発では、関数やプロシージャをまとめた「パッケージ」を活用することが一般的です。その中でも、仕様(Specification)と本体(Body)を明確に分離して設計することは、保守性・可読性・リリースの柔軟性を飛躍的に高...
PL/SQL

【PL/SQL】エラーログを自動収集するDBMS_ERRLOGの使い方

データ移行やバルク更新の最中に一部の行だけが制約違反で落ちてしまい、処理全体が中断してやり直しになる――そんな無駄を避けるために用意されているのがDBMS_ERRLOGとLOG ERRORS句です。挿入や更新、削除、MERGEといったDML...
PL/SQL

【PL/SQL】UTL_HTTPを使ったWeb API連携の実装方法

Web APIとの連携をPL/SQLだけで完結させたい場合、UTL_HTTPは最も汎用的な選択肢です。GETでのデータ取得、POSTでのJSON送信、ヘッダー操作、タイムアウト、HTTPSやプロキシ、認証トークンの扱いまで一通りカバーできま...
PL/SQL

【PL/SQL】セキュリティコンテキスト(DBMS_SESSION.SET_CONTEXT)の利用例

アプリケーションとデータベースを連携させる際、ユーザーごとに異なる条件でアクセス制御をしたい場面があります。PL/SQLでは「セキュリティコンテキスト」を活用することで、セッション単位で任意の値を格納し、その値に基づいたアクセス制御や条件分...
PL/SQL

【PL/SQL】結果キャッシュ(FUNCTION RESULT_CACHE)の活用方法

PL/SQLでは同じ入力に対して同じ結果を返す純粋関数を多用するケースがあります。しかし大規模な計算や集計を伴う関数を何度も呼ぶと、パフォーマンスが大きく低下することもあります。そこで役立つのがOracleの「結果キャッシュ(FUNCTIO...
PL/SQL

【PL/SQL】JSON_TABLEとPL/SQLを組み合わせたJSON処理

JSONをRDBの力で高速に扱いたいとき、OracleのJSON_TABLEは最強の相棒になります。JSON列やCLOBに入っているドキュメントを、その場でリレーショナルな行・列に展開できるため、JOINや集計、インデックスの恩恵をフルに受...
PL/SQL

【PL/SQL】外部ファイルを読み書きする方法(UTL_FILEの基本と注意点)

データベースからサーバ上のファイルを直接読み書きしたい場面では、PL/SQL標準パッケージのUTL_FILEが有効です。ログ出力やCSVの生成、取り込み前の軽い整形などをデータベース内だけで完結でき、バッチ処理の自動化にも向いています。ここ...
PL/SQL

【PL/SQL】メール送信を自動化する方法(UTL_MAIL / UTL_SMTP活用)

社内バッチの完了通知やエラーログの送信、問い合わせ受付の自動応答など、メール送信はPL/SQLでの自動化と相性が良い機能です。Oracleには高レベルなUTL_MAILと、より細かく制御できるUTL_SMTPという2つの標準パッケージがあり...
PL/SQL

【PL/SQL】プロシージャの権限管理とAUTHIDの設計ベストプラクティス

PL/SQLのプロシージャやパッケージは「誰の権限で実行されるか」によって安全性と使い勝手が大きく変わります。設計の要はAUTHID(Definer/Invoker)と、実行権限・オブジェクト権限の付与方針をどう組み合わせるかです。ここでは...