PL/SQL †
- PL/SQLとは
Oracle社が開発したプログラミング言語で、データベース問い合わせ言語の標準であるSQLに
手続き型プログラミング言語を組み合わせたような仕様を持つ。
同社のデータベース管理システムである「Oracle」と組み合わせて使用し、プログラミング言語による処理の記述と、
SQLコマンドによるデータベースの検索やデータの更新などを組み合わせ、データベースアプリケーションを開発することができる。
高速な処理が必要なプログラムは、ストアドプログラムとしてシステム内に保存することができ、
高速に実行することができる。また、ストアドプログラムを外部から呼び出しやすいようパッケージ化することにより、
オブジェクト指向的な開発が可能となっている。
ちなみに、PostgreSQLのPL/pgSQLは、このPL/SQLを参考に実装されたものであるが、データベース管理システム (DBMS) の
実装に依存する部分(トランザクション管理の概念が異なる、例外を発生させることはできるが、キャッチできないなど)や、
構文中のシングルクォーテーションをエスケープしなければならないなど完全な互換性はない。
( http://ja.wikipedia.org/wiki/PL/SQL 、 http://e-words.jp/w/PL2FSQL.html より抜粋 )
- 変数の宣言
DECLARE
/* char型 */
char01 CHAR(10);
char02 CHAR(10) := '1234567890'; -- 初期値を設定する場合は 宣言に続けて := でセットする
/* varchar2型 */
varchar01 VARCHAR2(10);
/* number型 */
number01 NUMBER(10);
number02 NUMBER(10,2); -- 全桁数,小数点以下の桁値
/* BOOLEAN型 */
boolean01 BOOLEAN;
/* ユーザ定義例外 */
exception01 EXCEPTION;
/* ファイルハンドラ */
file01 UTL_FILE.FILE_TYPE;
/* レコードタイプ */
TYPE type01 IS RECORD (
ymd CHAR(6)
,shn_cd CHAR(10)
,uriage NUMBER(10)
);
/* レコード変数 */
rec01 type01;
/* カーソル宣言 */
CURSOR cur01 IS
SELECT
TABLE_NAME
,TABLESPACE_NAME
FROM
USER_TABLES;
/* カーソルデータ格納用レコード */
cur01_rec cur01%ROWTYPE;
BEGIN
・
・
- カーソルからのデータ読込
-- DBMS_OUTPUTパッケージからの出力をON
SET SERVEROUTPUT ON SIZE 1000000;
-- ここからPL/SQLブロック
DECLARE
/* カーソル宣言 */
CURSOR cur01 IS
SELECT
TABLE_NAME
,TABLESPACE_NAME
FROM
USER_TABLES;
/* カーソルデータ格納用レコード */
cur01_rec cur01%ROWTYPE;
BEGIN
-- カーソルのOPEN
OPEN cur01;
-- 1件目の取得
FETCH cur01 INTO cur01_rec;
-- 繰り返し処理
LOOP
-- カーソルにデータがない時は繰り返し処理を終了
IF cur01%NOTFOUND THEN
EXIT;
END IF;
-- テーブル名、表領域を表示
DBMS_OUTPUT.PUT_LINE(cur01_rec.TABLE_NAME || ',' || cur01_rec.TABLESPACE_NAME);
-- 2件目以降の取得
FETCH cur01 INTO cur01_rec;
END LOOP;
-- カーソルをCLOSE
CLOSE cur01;
END;
- カーソルFOR LOOP
-- DBMS_OUTPUTパッケージからの出力をON
SET SERVEROUTPUT ON SIZE 1000000;
-- ここからPL/SQLブロック
DECLARE
/* カーソル宣言 */
CURSOR cur01 IS
SELECT
TABLE_NAME
,TABLESPACE_NAME
FROM
USER_TABLES;
BEGIN
-- 繰り返し処理
FOR rec IN cur01 LOOP
-- テーブル名、表領域を表示
DBMS_OUTPUT.PUT_LINE(rec.TABLE_NAME || ',' || rec.TABLESPACE_NAME);
END LOOP;
END;
- Procedureの利用
DECLARE
-- 計算結果格納用
result_num NUMBER(10);
/* 加算処理 */
PROCEDURE proc01 ( arg1 IN NUMBER
,arg2 IN NUMBER
,arg3 IN OUT NUMBER
) IS
BEGIN
arg3 = arg1 + arg2;
END proc01;
BEGIN
proc01(10,20,result_num);
DBMS_OUTPUT.PUT_LINE('10 + 20 = ' || result_num);
END;
- ファイルの読み書き
DECLARE
uf01 UTL_FILE.FILE_TYPE;
file_rec VARCHAR2(255);
BEGIN
/* ディレクトリ作成
(PL/SQLでDDLを実行する場合は、動的SQL文かDBMS_SQLパッケージを使用する) */
EXECUTE IMMEDIATE 'CREATE OR REPLACE DIRECTORY TEST_DIR AS ''c:/tmp''';
-- 書込テスト
uf01 := UTL_FILE.FOPEN( 'TEST_DIR' , 'utl_file_test.txt', 'a', 256);
UTL_FILE.PUT_LINE ( uf01, '書き込みTEST!!', true);
UTL_FILE.FCLOSE(uf01);
-- 読込テスト
uf01 := UTL_FILE.FOPEN( 'TEST_DIR' , 'utl_file_test.txt', 'r', 256);
LOOP
file_rec := '';
BEGIN
UTL_FILE.GET_LINE ( uf01, file_rec, 256);
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL;
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('READ ERROR!');
END;
IF file_rec IS NULL OR file_rec = '' THEN
EXIT;
END IF;
DBMS_OUTPUT.PUT_LINE(file_rec);
END LOOP;
UTL_FILE.FCLOSE(uf01);
END;
※CREATE DIRECTORYを行うには CREATE ANY DIRECTORY 権限が必要。
( grant CREATE ANY DIRECTORY to ユーザ; )
※DIRECTORY下のファイルに読み書きを行うには、該当DIRECTORYへの READ,WRITE権限が必要。
(GRANT READ,WRITE ON DIRECTORY ディレクトリ名 TO ユーザ; )
|