OracleのPL/SQL言語には、データベースからデータを取得するための基本的なメカニズムが2つあります。SELECTとカーソルです。SELECTは1行をローカル変数に返すように設計されています。一方、カーソルは複数の行(つまり「行セット」)を選択し、それらを1行ずつ処理する機能を提供します。PL/SQLブロックでSELECTを使用する場合は…
OracleのPL/SQL言語には、データベースからデータを取得するための2つの基本的なメカニズム、SELECTとカーソルがあります。SELECTは1行をローカル変数に返すように設計されています。一方、カーソルは複数の行(つまり「行セット」)を選択し、それらを1行ずつ処理する機能を提供します。
PL/SQLブロックでSELECT文を使用する場合、クエリによって返される行が常に1行だけであることを確認することが重要です。複数の行が返された場合は、TOO_MANY_ROWS例外が発生します。リストAは、OracleのHRサンプルスキーマの例を示しています。姓がKingの従業員が複数存在するため、スクリプトは失敗します。
宣言するl_employee_last_name 従業員.last_name%TYPE;
l_従業員のフルネーム VARCHAR2(52);
始める
l_employee_last_name := 'キング';
SELECT 姓 || ', ' || 名
INTO l_employee_full_name
従業員から
ここで、 last_name = l_employee_last_name;
DBMS_OUTPUT.PUT_LINE (l_employee_full_name);
終わり;
/
コードがこのエラーから安全であることを確認する方法は 4 つあります。
- 主キーを使って行を選択します。リストAではlast_nameで行を選択していますが、同じ姓の従業員が複数存在する可能性が非常に高いです。コードを変更してemployee_idで行を選択するようにすれば、テーブル内の主キー列に同じ値を持つ行は1行だけなので、エラーを回避できます。
- 集計関数を選択します。定義上、集計関数(AVERAGE、COUNT、MIN、MAX、SUM)は結果として1行のみを返します。WHERE句に一致する行がない場合でも、それらの行をCOUNTすると1行、つまり「0」が返されます。テーブルのMINまたはMAXを選択することは、処理の制限を決定するためによく使用されます。
- ROWNUMを使用してクエリを制限します。複数の行が返される可能性があるものの、どの行も他の行と同等である場合は、クエリに「AND ROWNUM < 2」という条件を追加してみてください。これにより、結果がセットの最初の行に制限されます。ただし、返されるのは最初の物理的な行であることに注意してください。ROWNUMを含むクエリにORDER BYを追加しても、最上位行や最下位行は返されず、最初の行のみが返されます。
- SELECT文を独立したブロックで囲みます。SELECT文を内部ブロックで囲むことで、エラー発生時に適切な値を返す例外ハンドラを記述できます。リストBは、このように拡張された前のクエリを示しています。
宣言するl_employee_last_name 従業員.last_name%TYPE;
l_従業員のフルネーム VARCHAR2(52);
始める
l_employee_last_name := 'キング';
始める
SELECT 姓 || ', ' || 名
INTO l_employee_full_name
従業員から
ここで、 last_name = l_employee_last_name;
例外
NO_DATA_FOUNDの場合
l_employee_full_name := '(ファイルに存在しません)';
行数が多すぎる場合
l_employee_full_name := '(重複した名前)';
終わり;
DBMS_OUTPUT.PUT_LINE (l_employee_full_name);
終わり;
/
ボブ・ワトキンス(OCP、MCITP、MCDBA、MCT)は、テクニカルトレーナー、コンサルタント、データベース管理者として25年の経験を持つコンピュータのプロフェッショナルです。ダラス/フォートワース地域に拠点を置くデータベースコンサルティングおよびトレーニング会社、B. Watkinsのシニアコンサルタント兼マネージングパートナーを務めています。ボブのウェブサイトをご覧ください。
——————————————————————————————
Oracleのヒントをメールで受け取る
TechRepublicの無料Oracleニュースレターは毎週水曜日に配信され、Oracleユーティリティの自動化、データベースアラートの生成、有向グラフ問題の解決など、さまざまなトピックを取り上げています。今すぐ購読しましょう!

ボブ・ワトキンス