PL/SQLでTOO_MANY_ROWSエラーを回避する - TechRepublic

PL/SQLでTOO_MANY_ROWSエラーを回避する - TechRepublic

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ユーティリティの自動化、データベースアラートの生成、有向グラフ問題の解決など、さまざまなトピックを取り上げています。今すぐ購読しましょう!

記事をシェア
ボブ・ワトキンスの画像

ボブ・ワトキンス

Tagged: