PL/SQL

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)と、実行権限・オブジェクト権限の付与方針をどう組み合わせるかです。ここでは...
PL/SQL

【PL/SQL】DBMS_RLSによる行レベルセキュリティの実装方法

行レベルセキュリティ(Row-Level Security, RLS)は、同じ表でもユーザーや状況に応じて「見える行」を自動的に絞り込む仕組みです。OracleではDBMS_RLS(Virtual Private Database, VPD...
PL/SQL

【PL/SQL】DBMS_WARNINGでコンパイル時の警告を制御する方法

PL/SQLのコードをコンパイルするとき、Oracleは潜在的な問題や非推奨な書き方を警告として通知してくれます。これらは実行エラーではないため無視されがちですが、将来的な不具合やパフォーマンス低下を防ぐ重要なヒントでもあります。DBMS_...
PL/SQL

【PL/SQL】DBMS_TRACEで処理の実行経路を追跡する方法

PL/SQLの実行経路(どのプロシージャや関数がどの順で呼ばれ、どの行で例外が起きたか)を可視化したいときは、DBMS_TRACEを使うとSQLトレースでは見えにくい「PL/SQL呼び出しの足跡」を取得できます。DBMS_PROFILERや...
PL/SQL

【PL/SQL】パーティションテーブルとPL/SQLの組み合わせ活用例

大規模データを扱うOracleでは、パーティションテーブルを前提にPL/SQLを設計すると性能と運用性が一気に上がります。読み取りはパーティションプルーニングで最小I/Oに、書き込みはパーティション単位のDMLやEXCHANGEで一括・高速...
PL/SQL

【PL/SQL】FORALLとSAVE EXCEPTIONSでバルクDMLのエラーを個別処理する方法

大量データを高速に処理する際、PL/SQLのFORALLはDMLをまとめて送ることでコンテキストスイッチを削減できる強力な構文です。ただしバッチ内の一部行だけが制約違反で失敗すると、通常は全体が例外で中断されてしまいます。SAVE EXCE...
PL/SQL

【PL/SQL】DBMS_LOCKを使った排他制御の実装方法

アプリケーションの同時実行制御をPL/SQLだけで実現したい場合、DBMS_LOCKは強力な選択肢になります。テーブル行ロックでは表現しづらい「任意の名前に対する排他」や「ジョブ名ごとの同時実行抑止」を、データ更新を伴わずに安全に行えます。...
PL/SQL

【PL/SQL】DBMS_ALERTとDBMS_PIPEでプロセス間通信を行う方法

Oracleデータベース内のセッション間で軽量に通知やメッセージをやり取りしたいとき、PL/SQLの標準パッケージであるDBMS_ALERTとDBMS_PIPEが役に立ちます。DBMS_ALERTは「イベント通知」に向いたコミット連動型の仕...
PL/SQL

【PL/SQL】エディションベースリディフィニション(EBR)とパッケージ管理

エディションベースリディフィニション(Edition-Based Redefinition, EBR)は、Oracle Databaseが提供するアプリケーションの無停止リリースを実現する仕組みです。従来はパッケージやビューを変更する際にセ...
PL/SQL

【PL/SQL】WITH FUNCTION句を使ってSQL内に関数を埋め込む方法

Oracle Database 12c以降では、SQL文のWITH句の中にPL/SQL関数を埋め込める「WITH FUNCTION句」が利用できます。これにより、そのSQL専用のローカル関数を定義し、外部スキーマに依存しない自己完結したSQ...
PL/SQL

【PL/SQL】マルチテーブルINSERTをPL/SQLから活用する方法

マルチテーブルINSERTは一度の表スキャンで複数の表へ同時に挿入できるOracle独自の拡張構文です。ETLやデータ移送、親子関係の同時作成、条件分岐での仕分けなどで威力を発揮し、PL/SQLからも通常のINSERTと同様に実行できます。...
PL/SQL

【PL/SQL】ファイングレイン監査(FGA)とPL/SQLの活用

ファイングレイン監査(FGA: Fine Grained Auditing)は、Oracleが提供する高度な監査機能で、特定の条件に合致したデータアクセスだけを記録できます。従来の監査が「誰がどの表にアクセスしたか」といった大まかな単位だっ...
PL/SQL

【PL/SQL】Invoker RightsとDefiner Rightsの違いと使い分け

PL/SQLのストアドプロシージャやファンクションは、デフォルトでは「作成者の権限」で実行されます。これをDefiner Rights(定義者権限)と呼びます。一方でInvoker Rights(呼び出し者権限)を指定すると、実行時に呼び出...