PL/SQL

PL/SQL

【PL/SQL】DBMS_APPLICATION_INFOで処理状況を監視に出力する方法

DBMS_APPLICATION_INFOは、実行中のPL/SQLやアプリケーション処理の「いま何をやっているか」をデータベース側へ明示するための標準パッケージです。V$SESSIONやAWR、ASHの画面にモジュール名やアクション名、長時...
PL/SQL

【PL/SQL】DBMS_PROFILERでコード実行時間を計測する方法

DBMS_PROFILERはPL/SQLコードの行単位で実行回数や経過時間を計測し、どこが遅いのかを数値で可視化できる標準パッケージです。体感やログだけでは見えないボトルネックを特定し、最小の修正で最大の効果を狙うための強力な手段になります...
PL/SQL

【PL/SQL】コレクション(配列・ネスト表)の基本と活用例

PL/SQLには配列やリストを表現できる「コレクション」という仕組みがあり、大量データを効率的に扱うために活用されます。代表的なコレクションには「連想配列」「ネスト表」「VARRAY」の3種類があり、それぞれ特徴と用途が異なります。ここでは...
PL/SQL

【PL/SQL】DBMS_METADATAでスキーマ定義を取得する方法

Oracleでテーブルやビュー、インデックス、シーケンスなどのオブジェクト定義を確認したいとき、DBMS_METADATAパッケージを使うと簡単にDDLを取得できます。GUIツールを使わずSQLだけで定義を取得できるため、スキーマ管理やバー...
PL/SQL

【PL/SQL】AUTONOMOUS TRANSACTIONで独立した処理を行う方法

PL/SQLのトランザクションは通常1セッション内で共有され、COMMITやROLLBACKは全体に影響します。しかし「本体トランザクションとは独立してログを書き込みたい」「監査やエラーログだけは確定させたい」といった場面では、AUTONO...
PL/SQL

【PL/SQL】SAVEPOINTを使った部分ロールバックの実装方法

トランザクションの一部だけを取り消して処理を継続したい時、PL/SQLではSAVEPOINTとROLLBACK TO SAVEPOINTを組み合わせることで安全に実現できます。Oracleのトランザクションはネストできませんが、名前付きのセ...
PL/SQL

【PL/SQL】REF CURSORを使った柔軟なデータ取得方法

REF CURSOR(参照カーソル)は、SELECTの結果集合への“ハンドル”を変数として受け渡せる仕組みです。固定の列構成に縛られず、呼び出し元へストリーミング的にデータを渡せるため、画面やレポートなど多様な取得要件に柔軟に対応できます。...
PL/SQL

【PL/SQL】コミットとロールバックの正しい使い方

トランザクション制御はPL/SQLの信頼性と性能に直結します。COMMITとROLLBACKはデータベースの一貫性を保ちつつ、いつ確定・取り消しを行うかを決める重要な操作です。誤用すると整合性崩壊やパフォーマンス劣化を招くため、基本的な仕組...
PL/SQL

【PL/SQL】パフォーマンス改善のためのヒントと注意点

PL/SQLの性能はSQLの品質・I/O・コンテキストスイッチ・データ量・ロジック構造に大きく左右されます。安易なチューニングよりも「正しい設計と測定→ボトルネック特定→最小変更」の順序が重要です。ここでは実務で効くパフォーマンス改善の勘所...
PL/SQL

【PL/SQL】パッケージを使ったコード管理と再利用性向上

PL/SQLで規模が大きくなるほど、プロシージャやファンクションが散在してメンテナンスが難しくなります。パッケージを使うとインターフェースと実装を分離でき、名前空間で衝突を避け、初期化や状態の保持、オーバーロードなどを通じて再利用性を高めら...
PL/SQL

【PL/SQL】動的SQLのセキュアな書き方|EXECUTE IMMEDIATEとバインド変数の正しい活用

PL/SQLでは、SQL文を文字列として組み立てて実行できる「動的SQL」が強力な機能として提供されています。しかし、使い方を誤るとSQLインジェクションのリスクやパフォーマンス低下を招く可能性があります。この記事では、EXECUTE IM...
PL/SQL

【PL/SQL】コンパイル時エラーと警告の対処法|SHOW ERRORS・USER_ERRORSの使い方

PL/SQLでプロシージャや関数、パッケージを作成するときに避けて通れないのが「コンパイルエラー」です。構文ミスや型の不一致などにより、意図した通りにオブジェクトが作成されないケースがあります。本記事では、SHOW ERRORSやUSER_...
PL/SQL

【PL/SQL】DBMS_SCHEDULERでジョブを管理する方法|定期実行・依存関係の制御とログ管理

Oracle Databaseで定期処理を実行したいとき、従来はDBMS_JOBが使われていましたが、現在はより高機能なDBMS_SCHEDULERが推奨されています。DBMS_SCHEDULERは、ジョブのスケジュール、依存関係の管理、ロ...
PL/SQL

【PL/SQL】パイプライン関数の仕組みと活用術|高速な戻り値ストリームで大量データ処理に対応

PL/SQLで大量データを処理しながら、戻り値としての結果セットを効率的に返したい場面は少なくありません。通常の関数では、処理が完了するまで結果が返らず、応答速度が遅くなることがあります。そこで役立つのが「パイプライン関数(Pipeline...
PL/SQL

【PL/SQL】MERGE文の活用法|UPSERT処理を高速かつ安全に実装する方法

PL/SQLでデータをINSERTまたはUPDATEする処理は、業務システムで頻繁に登場します。例えば「データが存在すれば更新し、なければ新規挿入する」というロジックは、通称「UPSERT(アップサート)」と呼ばれます。このような処理を簡潔...
PL/SQL

【PL/SQL】カーソルFORループと明示的カーソルの使い分け|パフォーマンスと可読性の観点から

PL/SQLで繰り返し処理を行う際によく利用されるのが「カーソル」です。カーソルには大きく分けて以下の2種類があります: カーソルFORループ(暗黙的カーソル) 明示的カーソル(OPEN/FETCH/CLOSEによる制御)本記事では、この2...
PL/SQL

【PL/SQL】IN・OUT・IN OUTパラメータの使い分け|プロシージャ引数の基本

PL/SQLでストアドプロシージャやファンクションを定義する際、引数(パラメータ)には3種類のモードがあります。それがIN・OUT・IN OUTです。これらのモードを適切に使い分けることで、値の受け渡しや処理結果の返却を柔軟に制御できます。...
PL/SQL

【PL/SQL】ネストされたブロックの書き方とスコープの考え方

PL/SQLでは、処理をブロック単位で構成するのが基本ですが、そのブロックの中にさらに別のブロックを定義することができます。これをネストされたブロック(入れ子ブロック)と呼びます。この記事では、PL/SQLでのネストブロックの書き方と、各ブ...
PL/SQL

【PL/SQL】バルク処理で高速化!FORALLとBULK COLLECTの使い方

PL/SQLで大量データを扱う場合、処理速度が問題になることがあります。通常のループ処理では1件ごとにSQLエンジンとPL/SQLエンジンを行き来するため、パフォーマンスが大きく低下してしまいます。そんなときに活用したいのが「バルク処理(B...
PL/SQL

【PL/SQL】ストアドプロシージャとファンクションの違いと作り方

OracleのPL/SQLを活用する際に、避けて通れないのが「ストアドプロシージャ(Procedure)」と「ファンクション(Function)」です。どちらも処理をカプセル化して再利用できる便利な仕組みですが、その目的や使い方には明確な違...