EXECUTE IMMEDIATE文を使ってSELECT文を出力する
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