はじめに ■コース概要と目的 コンポジット型やバルク配列処理、動的な SQL 文、パッケージなど、 Oracle 独自のプログラミング言語 「PL/SQL」の応用的な記述方法について、実習を通して習得します。 ■受講対象者 これから PL/SQL を使用してアプリケーション開発をされる方。 ■前提条件 「SQL トレーニング」「PL/SQL プログラミングⅠ」コースを受講された方。もしくは、同等の知識をお持ち の方。 ※DML 文、トランザクションについては既に習得済みであること。 ■テキスト内の記述について ▼構文 [ ] 省略可能 { A | B } A または B のどちらかを選択 n 数値の指定 _ デフォルト値 ▼マーク 指定バージョンからの新機能 (左記の場合、Oracle 12cR1 からの新機能) 知っておいたほうが良いテクニック、もしくは注意事項 参照ページ データ・ディクショナリ・ビュー CONTENTS 第1章 コンポジット型 1.コンポジット型概要----------------------------------- 1-1 2.レコードの使用--------------------------------------- 1-3 3.結合配列の使用--------------------------------------- 1-7 4.レコードの結合配列----------------------------------- 1-11 第2章 バルク配列処理 1.バルク配列処理--------------------------------------- 2-1 第3章 システム固有の動的 SQL 1.システム固有の動的 SQL------------------------------- 3-1 2.EXECUTE IMMEDIATE 文--------------------------------- 3-3 3.動的 SQL の効率化------------------------------------- 3-7 第4章 カーソル変数 1.カーソル変数----------------------------------------- 4-1 2.カーソル変数を使用した動的 SQL----------------------- 4-3 3.パラメータとしてのカーソル変数の受渡し--------------- 4-7 第5章 ユーザー定義パッケージ 1.パッケージ概要--------------------------------------- 5-1 2.パッケージの構成------------------------------------- 5-3 3.パッケージの利点------------------------------------- 5-5 4.パッケージの作成と実行------------------------------- 5-9 5.パッケージの活用------------------------------------- 5-13 6.パッケージの再コンパイルと影響----------------------- 5-17 7.パッケージの削除------------------------------------- 5-21 CONTENTS 第6章 ユーティリティ・パッケージ 1.ユーティリティ・パッケージ概要----------------------- 6-1 2.UTL_FILE パッケージ----------------------------------- 6-3 3.DBMS_SCHEDULER パッケージ----------------------------- 6-15 付録 1.PL/SQL 使用環境--------------------------------------- 付-1 2.PL/SQL の主なデータ型--------------------------------- 付-2 3.プログラム作成時の注意事項--------------------------- 付-5 4.予約語・キーワード一覧------------------------------- 付-9 5.依存性の確認----------------------------------------- 付-13 6.ソース・コードの隠蔽化------------------------------- 付-17 7.DBMS_OUTPUT パッケージ-------------------------------- 付-21 8.DBMS_OUTPUT パッケージを使用したデバッグ-------------- 付-25 9.EXECUTE IMMEDIATE 文と DBMS_SQL パッケージの選択------- 付-29 10.重複するプレースホルダの使用------------------------- 付-31 11.バルク動的 SQL の使用--------------------------------- 付-33 12.FORALL の例外処理------------------------------------- 付-37 13.BULK_ROWCOUNT 属性------------------------------------ 付-39 14.結果セットの表示------------------------------------- 付-41 15.ネイティブ・コンパイル------------------------------- 付-43 16.DBMS_LOCK パッケージ---------------------------------- 付-53 17.DBMS_JOB パッケージ----------------------------------- 付-61 18.DBMS_ALERT パッケージ--------------------------------- 付-67 19.DBMS_PIPE パッケージ---------------------------------- 付-75 20.DBMS_SHARED_POOL パッケージ--------------------------- 付-83 CONTENTS 21.DBMS_PROFILER パッケージ---------------------- 付-87 22.DBMS_RANDOM パッケージ------------------------ 付-93 23.DBMS_UTILITY パッケージ----------------------- 付-99 24.UTL_MAIL パッケージ--------------------------- 付-105 第3章 システム固有の動的 SQL この章では、動的 SQL を使用した SQL 文の記述方法について説明します。 1. システム固有の動的 SQL 2. EXECUTE IMMEDIATE 文 3. 動的 SQL の効率化 第 3 章「システム固有の動的 SQL」 1.システム固有の動的 SQL EXECUTE IMMEDIATE 文を使用するとシステム固有の動的 SQL を実行できます。動的 SQL はプログラム実行時に SQL を組立てることができるため、アクセス対象のオブジェクトが不明な場合などに有効です。 (1) 静的 SQL と動的 SQL PL/SQL プログラムの中で使用する SQL には、「静的 SQL」「動的 SQL」の 2 種類の記述方法があります。 1) 静的 SQL 静的 SQL とは、プログラム内で指定された特定のオブジェクト(表や列)にアクセス する SQL です。SQL 自体はプログラムを通して変化することがありません。 2) 動的 SQL 動的 SQL とは、プログラム内で指定するオブジェクトが実行時に変化する SQL です。検索条件を増減させ ることもできます。 ■静的 SQL および動的 SQL の特徴 静的 SQL 動的 SQL SQL の内容 固定 可変 オブジェクト名 固定 可変 PL/SQL でサポートする SQL SELECT 文 DML 文 トランザクション制御文 SELECT 文 DML 文 トランザクション制御文 DDL 文 セッション制御文 システム制御文 (2) 動的 SQL 使用時の注意事項 静的 SQL はプログラムを通して変化しないため、参照オブジェクトのチェック、権限のチェックといったコン パイルはプログラム作成時に行われます。 一方、動的 SQL は実行するまでアクセスするオブジェクトなどが未定であるため、作成時ではなく実行時にコ ンパイルが行われます。そのため、実行時のオーバーヘッドが高くなり、静的 SQL に比べパフォーマンスが劣り ます。したがって、静的 SQL では記述できない処理のみに動的 SQL を使用します。 株式会社アシスト Copyright(C) K.K. Ashisuto All Rights Reserved. 3-1 第 3 章「システム固有の動的 SQL」 ■静的 SQL SELECT * FROM emp WHERE deptno = 条件値 ; アクセス対象のオブジェクトは定まっており、パラメータを使用した条件値の受渡しができる。 ■動的 SQL SELECT * FROM 表名 WHERE 列名 = 条件値 ; 条件値だけでなく、アクセス対象のオブジェクトを未定にすることができる。 パラメータを使用して条件値やオブジェクト名を受渡し、実行時に SQL を組立てることができる。 SELECT * FROM 表名 WHERE 列名 = 条件値 AND 列名 = 条件値 ; 条件値やアクセス対象のオブジェクトだけでなく、検索条件を増減させることもできる。 Copyright(C) K.K. Ashisuto All Rights Reserved. 株式会社アシスト 3-2 第 3 章「システム固有の動的 SQL」 2. EXECUTE IMMEDIATE 文 動的 SQL を実行するには EXECUTE IMMEDIATE 文を使用します。EXECUTE IMMEDIATE 文は静的 SQL では実行できない SQL も実行できます。 (1) 動的 SQL で実行できる SQL 文 ・動的 SQL - DML 文 - SELECT...INTO 文(複数行の結果を戻す SELECT 文はカーソル変数を使用します) ・DDL 文(CREATE 文など) ・セッション制御文(ALTER SESSION 文など) ・システム制御文(ALTER SYSTEM 文) 「カーソル変数」(4 章) (2) EXECUTE IMMEDIATE 文 EXECUTE IMMEDIATE 文に続く文字列(テキスト)を SQL として実行します。 EXECUTE IMMEDIATE SQL テキスト ; ■SQL 組立て時の注意事項 EXECUTE IMMEDIATE に続く文字列は SQL として実行されるため、組立てられた文字列が SQL の構文規則に即 している必要があります。そのため、SQL を組立てる際は以下の点に注意してください。 ・SQL として認識させる文字列(SQL テキスト)を単一引用符(')で囲みます。変数やパラメータに対して は必要ありません。 ・SQL 文中に変数やパラメータが含まれる場合は、コンカチネーション(||)で連結します。 ・SQL テキストと変数・パラメータを連結する際、文字間に空白を設けないと実行時にエラーが発生しま す。 株式会社アシスト Copyright(C) K.K. Ashisuto All Rights Reserved. 3-3 第 3 章「システム固有の動的 SQL」 例)パラメータで表名と条件値を指定し、条件に合致した表の対象行を削除して画面に表示するプログラム を作成する。 SQL> 2 3 4 5 6 7 8 9 10 11 CREATE OR REPLACE PROCEDURE delete_records(t_name VARCHAR2,clause VARCHAR2 DEFAULT NULL) IS where_clause VARCHAR2(100) := ' WHERE ' || clause; BEGIN IF clause IS NULL 文字データとパラメータを連結して THEN where_clause := NULL; DELETE文を組立て、実行する END IF; EXECUTE IMMEDIATE 'DELETE FROM ' || t_name || where_clause; DBMS_OUTPUT.PUT_LINE('DELETE FROM ' || t_name || where_clause); END; / 例)上記プログラムを実行する。 SQL> EXECUTE delete_records('EMP','deptno = 10') DELETE FROM EMP WHERE deptno = 10 組立てたSQLを画面に表示 ■SQL の組立て方法 SQL テキスト EXECUTE IMMEDIATE 変数・パラメータ 'DELETE FROM ' || t_name ; FROM と表名が 連続している コンカチネーションで連結 ・空白がないためエラー EXECUTE IMMEDIATE 'DELETE FROM' || t_name; ⇒ DELETE FROMEMP; ・空白があるため実行可能 EXECUTE IMMEDIATE 'DELETE FROM ' || t_name; ⇒ DELETE FROM EMP; Copyright(C) K.K. Ashisuto All Rights Reserved. 株式会社アシスト 3-4 第 3 章「システム固有の動的 SQL」 (3) DDL 文、セッション制御文、システム制御文の記述 EXECUTE IMMEDIATE 文を使用すると、PL/SQL プログラム内で DDL 文、セッション制御文、システム制御文を記述 できます。例えば、PL/SQL プログラム内でオブジェクトを削除したい場合や、ALTER SESSION 文を使用して、そ のセッションだけ初期化パラメータの値を変更したい場合に便利です。 株式会社アシスト Copyright(C) K.K. Ashisuto All Rights Reserved. 3-5 第 3 章「システム固有の動的 SQL」 例)指定したオブジェクトを削除するプログラムを作成し、実行する。 SQL> 2 3 4 5 6 CREATE OR REPLACE PROCEDURE drop_object(object_type VARCHAR2,name VARCHAR2) IS BEGIN EXECUTE IMMEDIATE 'DROP '|| object_type || name; END; 動的SQLを使用することでDDL文が実行可能 / プロシージャが作成されました。 SQL> EXECUTE drop_object('TABLE ','t1') PL/SQL プロシージャが正常に完了しました。 例)PL/SQL プログラムの中で初期化パラメータ plsql_code_type の値を変更する。 BEGIN EXECUTE IMMEDIATE 'ALTER SESSION SET plsql_code_type = ''NATIVE'''; …省略… 動的SQLを使用することでセッション制御文が実行可能 END; ※単一引用符内で単一引用符を認識させるためには、二重にして指定する必要があります。 Copyright(C) K.K. Ashisuto All Rights Reserved. 株式会社アシスト 3-6 第 3 章「システム固有の動的 SQL」 3. 動的 SQL の効率化 静的・動的に関わらず、SQL は解析結果を共有できればデータベース全体のパフォーマンスが向上します。動的 SQL を使用する場合、プレースホルダを使用することで SQL 解析結果の共有率を高めることができます。 (1) SQL の解析結果の共有化 SQL を発行すると、SQL は解析・実行されます。SQL の解析結果はすぐには解放されず、しばらく共有メモリー 上に保持されます。その後、再度同じ SQL を発行すると、残された解析結果を再利用できるため、パフォーマン スが向上します。 また、SQL の条件値だけを変更して SQL を実行する場合、条件値に変数を用いると解析結果を共有できます。 ■変数を使用しない場合(SQL 解析結果を共有しにくい) 共有メモリー 実行 DELETE 文 DELETE FROM emp WHERE empno = 7369 DELETE FROM emp WHERE empno = 7499 異なる条件値ごとに SQL 文を解析するため、条件値ごとに解析する分、パフォーマンスが低下する。 ■変数を使用する場合(SQL 解析結果を共有しやすい) EXECUTE del_pro (7369) EXECUTE del_pro (7499) 共有メモリー 実行 ① 7369 ② 7499 DELETE FROM emp WHERE empno = no PROCEDURE del_pro(no NUMBER) … DELETE FROM emp WHERE empno = no ; END; 変数 ①変数を含めて SQL を解析するため、条件値が未定な状態で解析結果が共有メモリー上に保持される。 ②条件値に変数を用いている SQL の場合は、共有メモリー上に残されている解析結果を再利用できるため、 解析にかかるオーバーヘッドを低減でき、パフォーマンスが向上する。 株式会社アシスト Copyright(C) K.K. Ashisuto All Rights Reserved. 3-7 第 3 章「システム固有の動的 SQL」 (2) 動的 SQL の解析結果の共有化 動的 SQL 実行時に SQL 解析結果を共有するには、プレースホルダを使用する必要があります。 1) プレースホルダ プレースホルダは動的 SQL に使用する変数のことです。宣言部で定義せずに、プレースホルダとする文字 列の直前にコロン(:)を付けて使用します。 2) バインド引数 バインド引数はプレースホルダに代入する値のことです。USING 句を使用して、プレースホルダに受渡す 値を指定します。 バインド引数は、SQL 中に指定したプレースホルダと位置で対応付いており、複数のプレースホルダを使 用する場合はバインド引数の順序をプレースホルダに対応させる必要があります。 例)プレースホルダを用いて、パラメータで指定した社員を EMP 表から削除するプログラムを作成する。 CREATE OR REPLACE PROCEDURE delete_emp(col_clause VARCHAR2,var NUMBER) IS BEGIN EXECUTE IMMEDIATE 'DELETE FROM emp WHERE '|| col_clause || ':num' USING var; END; ① CREATE … delete_emp(col_clause VARCHAR2,var NUMBER) … ① プレースホルダ バインド引数 EXECUTE IMMEDIATE 'DELETE FROM emp WHERE '|| col_clause || ' :num ' USING var ; ② ①ストアド・プログラムのパラメータを受渡し、実行 SQL の解析を行う。 ②解析を行った後にバインド引数をプレースホルダに受渡す。 補足:下記例では、条件値を受渡した後に解析するため、解析結果を共有しにくい。 CREATE OR REPLACE PROCEDURE delete_emp(col_clause VARCHAR2,var NUMBER) … EXECUTE IMMEDIATE 'DELETE FROM emp WHERE '|| col_clause || var; … Copyright(C) K.K. Ashisuto All Rights Reserved. 株式会社アシスト 3-8 索引 索引 A ACCESS_DENID、6-13 ALTER ANY PROCEDURE システム権限、付-1 ALTER ANY TRIGGER システム権限、付-1 ALTER PACKAGE ・・・ COMPILE 文、5-19 B BULK COLLECT 句、2-5 BULK_ROWCOUNT 属性、付-39 C catproc.sql、6-1、付-1 CHARSETMISMATCH、6-13 CLOSE 文、4-5 COUNT、1-9 CREATE ANY PROCEDURE システム権限、付-1 CREATE JOB システム権限、6-17、6-21 CREATE PACKAGE BODY 文、5-9 CREATE PACKAGE 文、5-9 CREATE PROCEDURE システム権限、付-1 CREATE TRIGGER システム権限、付-1 D DBMA_PIPE.PACK_MESSAGE プロシージャ、付-77 DBMA_PIPE.RECIVE_MESSAGE プロシージャ、付-79 DBMA_PIPE.SEND_MESSAGE プロシージャ、付-77 DBMA_PIPE.UNPACK_MESSAGE プロシージャ、付-79 DBMS_ALERT.REGUSTER プロシージャ、付-69 DBMS_ALERT.REMOVE プロシージャ、付-71 DBMS_ALERT.SIGNAL プロシージャ、付-69 DBMS_ALERT.WAITONE プロシージャ、付-71 DBMS_ALERT パッケージ、付-67、付-75 DBMS_DDL.DREATE_WRAPPED プロシージャ、付-20 DBMS_DDL パッケージ、付-20 DBMS_JOB.REMOVE プロシージャ、付-65 DBMS_JOB.SUBMIT プロシージャ、付-64 DBMS_JOB パッケージ、6-15、付-61 DBMS_LOCK.ALLOCATE_UNIQUE プロシージャ、付-55 DBMS_LOCK.RELEASE ファンクション、付-57 DBMS_LOCK.REQUEST ファンクション、付-57 DBMS_LOCK.SLEEP プロシージャ、付-59 DBMS_LOCK パッケージ、付-53 DBMS_OUTPUT.NEW_LINE プロシージャ、付-23 DBMS_OUTPUT.PUT_LINE プロシージャ、付-21 DBMS_OUTPUT.PUT プロシージャ、付-23 DBMS_OUTPUT パッケージ、付-21 DBMS_PIPE パッケージ、付-67、付-75 DBMS_PROFILER.START_PROFILER プロシージャ、付-87 DBMS_PROFILER.STOP_PROFILER プロシージャ、付-87 DBMS_PROFILER パッケージ、付-87 DBMS_RANDOM.NOMAL ファンクション、付-97 DBMS_RANDOM.STRING ファンクション、付-95 DBMS_RANDOM.VALUE ファンクション、付-96 DBMS_RANDOM パッケージ、付-93 DBMS_SCHEDULER.CREATE_JOB プロシージャ、6-17 DBMS_SCHEDULER.CREATE_SCHEDULE プロシージャ、6-21 DBMS_SCHEDULER.DROP_JOB プロシージャ、6-25 DBMS_SCHEDULER.DROP_SCHEDULE プロシージャ、6-25 DBMS_SCHEDULER パッケージ、6-15 DBMS_SHARED_POOL.KEEP プロシージャ、付-85 DBMS_SHARED_POOL パッケージ、付-83 DBMS_SQL.RETURN_RESULT プロシージャ、付-30、付-41 DBMS_SQL パッケージ、付-29、付-30 DBMS_UTILITY.COMPILE_SCHEMA プロシージャ、付-101 DBMS_UTILITY.GET_TIME ファンクション、付-103 DBMS_UTILITY パッケージ、付-99 dbmspool.sql、付-85 dbmsupgnv.sql、付-49 DELETE_FAILED、6-13 DELETE(m.n)、1-9 DEPTREE_FILL プロシージャ、付-13 DEPTREE ビュー、付-15 DROP ANY PROCEDURE システム権限、付-1 DROP ANY TRIGGER システム権限、付-1 DROP PACKAGE 文、5-21 E EXECUTE ANY PROCEDURE システム権限、付-1 EXECUTE IMMEDIATE 文、3-1、3-3 EXECUTE オブジェクト権限、付-1 EXISTS(n)、1-9 F FETCH...INTO 文、4-5 FILE_OPEN、6-13 FIRST、1-9 FORALL 文、2-3 FREQ 句、6-19 Copyright(C) K.K. Ashisuto All Rights Reserved. 株式会社アシスト 索引-1 索引 I T IDEPTREE ビュー、付-15 INDECIED OF 句、2-3 INTERNAL_ERROR、6-13 INVALID_FILEHANDLE、6-13 INVALID_FILENAME、6-13 INVALID_MAXLINESIZE、6-13 INVALID_MODE、6-13 INVALID_OFFSET、6-13 INVALID_OPERATION、6-13 INVALID_PATH、6-13 TABLE 型、1-1、1-7 TYPE ・・・ IS RECORD 文、1-3 TYPE ・・・ IS REF CURSOR 文、4-3 TYPE ・・・ IS TABLE OF 文、1-7 L LAST、1-9 LIMIT 句、2-7 LOB 型、付-4 N NEXT(n)、1-9 NO_DATA_FOUND、6-11 O OPEN...FOR 文、4-5 P PL/SQL 式、6-20 PLS_INTEGER 型、1-7 PLSQL_PROFILER_DATA 表、付-89 PLSQL_PROFILER_RUNS 表、付-89 PLSQL_PROFILER_UNITS 表、付-89 PRIOR(n)、1-9 proftab.sql、付-87 prvtmail.plb、付-107 U USER_JOBS ビュー、付-65 USER_OBJECTS ビュー、付-48 USER_PLSQL_OBJECTS_SETTINGS ビュー、付-45 USER_SCHEDULER_JOBS ビュー、8-16 USER_SCHEDULER_SHCEDULES ビュー、6-22 USING 句、3-8 UTL_FILE.FCLOSE_ALL プロシージャ、6-11 UTL_FILE.FCLOSE プロシージャ、6-11 UTL_FILE.FILE_TYPE 型、6-7 UTL_FILE.FOPEN ファンクション、6-7 UTL_FILE.FREMOVE プロシージャ、6-11 UTL_FILE.GET_LINE プロシージャ、6-11 UTL_FILE.NEW_LINE プロシージャ、6-9 UTL_FILE.PUT_LINE プロシージャ、6-9 UTL_FILE.PUT プロシージャ、6-9 UTL_FILE パッケージ、6-3 UTL_MAIL.SEND プロシージャ、付-109 UTL_MAIL パッケージ、付-105 utldtree.sql、付-13 utlirp.sql、付-47 utlmail.sql、付-107 utlrp.sql、付-49 W WRAP ユーティリティ、付-17 WRITE_ERROR、6-13 R READ_ERROR、6-13 RECODE 型、1-1、1-3 REF CURSOR 型、4-1、4-3 RENAME_FAILED、6-13 RETURNING...INTO 句、3-13 ROWTYPE_MISMATCH、4-3 ROW キーワード、1-5 S SAVE EXCEPTIONS、付-37 spnc_commands、付-45 SQL%BULK_ROWCOUNT 暗黙カーソル属性、2-4、付-39 株式会社アシスト Copyright(C) K.K. Ashisuto All Rights Reserved. 索引-2 索引 い は 依存性、付-13 インデント、付-5 バインド引数、3-8、付-31 パッケージ、5-1 パブリック・オブジェクト、5-15、5-3、5-5 バルク EXECUTE IMMEDIATE 文、付-33 バルク FETCH...INTO 文、付-35 バルク FORALL 文、付-35 バルク動的 SQL、付-33 バルク配列処理、2-1 お オーバーロード、5-15 か カレンダ式、6-19 カーソル変数、4-1、4-3 き キーワード、付-9 ふ ファイル・ハンドル、6-7 ファミリ、5-15、付-2 プライベート・オブジェクト、5-3、5-5 プレースホルダ、3-8、付-31 け 結合配列、1-1、1-7 ほ 本体、5-3 こ コメント、付-5 コレクション・メソッド、1-9 コンカチネーション、3-3 コンポジット型、1-1、付-4 さ 再コンパイル、5-17 参照型、付-4 し ゆ ユーザー定義パッケージ、5-1 ユーティリティ・パッケージ、5-1、6-1 よ 予約語、付-9 れ レコード、1-1、1-3 レコードの結合配列、1-11 仕様部、5-3 す スカラー型、1-1、付-3 せ 静的 SQL、3-1 て ディレクトリ・オブジェクト、6-5 ね ネイティブ・コンパイル、付-43 Copyright(C) K.K. Ashisuto All Rights Reserved. 株式会社アシスト 索引-3 PL/SQLプログラミングⅡ(12cR1対応版) 第1版 2015年1月1日 本テキストで使用されるメーカ名、商品名は各社の商標または登録商標です。当社の文書による許可なしに、 本誌の一部または全部を複製することはお断りします。 また、本誌に記載された内容については、予告なしに変更することがありますので、予めご了承ください。 株式会社アシストは、本書および本書に付属する資料についてその記載内容に誤りがないこと、および特定目的 に対する適合性に関するいっさいの保証を行うものではありません。 また、本資料を使用したことによって被った直接的・間接的な損害などについて、いかなる場合においても責任 を負いかねます。 発売元 株式会社 株式会社アシストは、日本オラクル 株式会社の代理店です。
© Copyright 2024 Paperzz