EXECUTE IMMEDIATE文を使ってSELECT文を出力する

2024-04-08

PL/SQLブロックからSELECT文を出力する方法

PL/SQLブロックは、Oracleデータベース内で実行されるプログラムです。このブロック内でSELECT文を実行し、その結果を出力することは可能です。

方法

以下の2つの方法があります。

DBMS_OUTPUTパッケージは、PL/SQLブロック内から文字列を出力するための標準的なパッケージです。このパッケージを使う方法は以下の通りです。

DECLARE
  l_cursor SYS_REFCURSOR;
BEGIN
  OPEN l_cursor FOR
    SELECT *
    FROM employees;

  LOOP
    FETCH l_cursor INTO l_emp_id, l_emp_name;
    DBMS_OUTPUT.PUT_LINE(l_emp_id || ', ' || l_emp_name);
  END LOOP;

  CLOSE l_cursor;
END;
DECLARE
  l_file UTL_FILE.FILE_TYPE;
BEGIN
  l_file := UTL_FILE.FOPEN('employees.txt', 'w');

  FOR r IN (
    SELECT *
    FROM employees
  ) LOOP
    UTL_FILE.PUT_LINE(l_file, r.emp_id || ', ' || r.emp_name);
  END LOOP;

  UTL_FILE.FCLOSE(l_file);
END;

出力結果

上記の例では、いずれの方法でも、employees表のデータがカンマ区切りで出力されます。

補足

  • DBMS_OUTPUTパッケージを使う場合は、クライアントツールによって出力結果の表示方法が異なります。
  • UTL_FILEパッケージを使う場合は、出力ファイルはデータベースサーバー上のファイルシステムに作成されます。



DBMS_OUTPUTパッケージを使う

DECLARE
  l_cursor SYS_REFCURSOR;
BEGIN
  OPEN l_cursor FOR
    SELECT *
    FROM employees;

  LOOP
    FETCH l_cursor INTO l_emp_id, l_emp_name;
    DBMS_OUTPUT.PUT_LINE(l_emp_id || ', ' || l_emp_name);
  END LOOP;

  CLOSE l_cursor;
END;
  • DECLAREセクションで、l_cursorという名前のカーソル変数を宣言します。
  • OPEN文で、employees表に対するSELECT文を実行し、その結果をカーソル変数l_cursorに格納します。
  • LOOP文で、カーソル変数l_cursorからデータを取り出し、1行ずつ出力します。
  • DBMS_OUTPUT.PUT_LINEプロシージャを使って、データを出力します。
  • CLOSE文で、カーソル変数l_cursorを閉じます。

UTL_FILEパッケージを使う

DECLARE
  l_file UTL_FILE.FILE_TYPE;
BEGIN
  l_file := UTL_FILE.FOPEN('employees.txt', 'w');

  FOR r IN (
    SELECT *
    FROM employees
  ) LOOP
    UTL_FILE.PUT_LINE(l_file, r.emp_id || ', ' || r.emp_name);
  END LOOP;

  UTL_FILE.FCLOSE(l_file);
END;

解説

  • UTL_FILE.FOPENプロシージャを使って、employees.txtという名前のファイルを開き、ファイルハンドル変数l_fileに格納します。
  • FORループを使って、SELECT文の結果を1行ずつ処理します。
  • UTL_FILE.PUT_LINEプロシージャを使って、データを出力ファイルに書き込みます。

実行方法

上記のサンプルコードをOracle SQL Developerなどのツールで実行すると、以下の結果が出力されます。

DBMS_OUTPUTパッケージを使う場合

1, 山田太郎
2, 佐藤花子
3, 田中一郎

UTL_FILEパッケージを使う場合

employees.txt
1, 山田太郎
2, 佐藤花子
3, 田中一郎



PL/SQLブロックからSELECT文を出力する他の方法

EXECUTE IMMEDIATE文は、文字列として渡されたSQL文を実行するものです。この方法を使うと、動的にSELECT文を生成して実行することができます。

DECLARE
  l_sql VARCHAR2(2000);
BEGIN
  l_sql := 'SELECT * FROM employees WHERE department_id = :d_id';

  EXECUTE IMMEDIATE l_sql
    USING IN d_id => 10;
END;
  • l_sql変数に、SELECT文を代入します。
  • EXECUTE IMMEDIATE文を使って、l_sql変数に格納されたSQL文を実行します。
  • USING句を使って、バインド変数d_idに値10を代入します。

DBMS_SQLパッケージは、SQL文を動的に実行するためのパッケージです。このパッケージを使うと、SELECT文だけでなく、INSERT、UPDATE、DELETEなどのSQL文を実行することができます。

DECLARE
  l_cursor SYS_REFCURSOR;
BEGIN
  DBMS_SQL.OPEN_CURSOR(l_cursor, 'SELECT * FROM employees');

  LOOP
    FETCH l_cursor INTO l_emp_id, l_emp_name;
    DBMS_OUTPUT.PUT_LINE(l_emp_id || ', ' || l_emp_name);
  END LOOP;

  DBMS_SQL.CLOSE_CURSOR(l_cursor);
END;

Webサービスを使う

PL/SQL Webサービスを使って、SELECT文の結果をWebブラウザなどのクライアントに出力することができます。

  • 简单的なSELECT文を実行する場合は、DBMS_OUTPUTパッケージを使うのが最も簡単です。
  • 動的にSELECT文を生成して実行する場合は、EXECUTE IMMEDIATE文を使う必要があります。
  • INSERT、UPDATE、DELETEなどのSQL文も実行する場合は、DBMS_SQLパッケージを使うのが便利です。
  • Webブラウザなどのクライアントに出力する場合は、PL/SQL Webサービスを使う必要があります。

sql oracle plsql


CURRENT_DATEとGETDATEで今日の日付を取得

DATE 関数は、日付時刻型から日付のみを取り出すために使用できます。例:このクエリは、Orders テーブルの OrderDate カラムから日付のみを取り出し、結果として 2024-04-02 のような形式で表示します。CONVERT 関数は、データ型を変換するために使用できます。 日付時刻型から日付のみを取得するには、style 引数に 103 を指定します。...


SQL Server 2005 でテーブル、ストアド プロシージャ、トリガー、制約、およびすべての依存関係を 1 つの SQL ステートメントでドロップする方法

このコードは、以下の手順を実行します。sp_MSforeachtable システムストアドプロシージャを使用して、すべてのユーザーテーブルをループ処理します。各テーブルに対して、DROP TABLE ステートメントを使用してテーブルをドロップします。...


【保存版】SQL ServerでIDENTITY_INSERTを使いこなす!有効化・無効化の方法とサンプルコード

IDENTITY_INSERT を有効化すると、以下の操作が可能になります。テーブルに重複する ID 値を持つ行を挿入する特定のシーケンスに従って ID 値を割り当てるIDENTITY_INSERT の有効化と無効化は、次の SET ステートメントを使用して行うことができます。...


PostgreSQL での挿入クエリ:トラブルシューティング

問題: PostgreSQL で単純な INSERT クエリを実行しようとすると、エラーが発生して挿入が失敗します。原因: この問題は、いくつかの要因によって発生する可能性があります。構文エラー: INSERT クエリの構文に誤りがあると、エラーが発生します。最も一般的な構文エラーには、次のものがあります。 誤ったキーワードの使用 値の数が列の数と一致しない 引用符の不一致 データ型と値の不一致...