ALTER PROCEDURE手続きのSQLオブジェクトの再作成

機能

SQL手続きのSQLオブジェクトを再作成します。また,Java手続きのコンパイルオプションを変更します。

使用権限

手続きの所有者
自分が所有する手続き(自分が定義したパブリック手続きを含む)のSQLオブジェクトを再作成できます。
  • AUTHORIZATION句には自分の認可識別子だけ指定できます。
  • ルーチン識別子には自分が所有する手続きだけ指定できます。
  • AUTHORIZATION句,及びルーチン識別子を両方省略した場合,エラーとなります。
DBA権限を持つユーザ
自分が所有する手続き(自分が定義したパブリック手続きを含む)と,他ユーザが所有する手続き(他ユーザが定義したパブリック手続きを含む)のSQLオブジェクトを再作成できます。
  • AUTHORIZATION句に自分,及び他ユーザの認可識別子を指定できます。
  • ルーチン識別子に自分,及び他ユーザが所有する手続きのルーチン識別子を指定できます。
  • AUTHORIZATION句,及びルーチン識別子を両方省略することでシステム内の全手続きを再作成できます。

形式

 ALTER PROCEDURE
   〔{〔認可識別子.〕ルーチン識別子
     |〔AUTHORIZATION 認可識別子〕
      〔ALL|INDEX USING〔認可識別子.〕表識別子〕}〕
   〔SQLコンパイルオプション〔SQLコンパイルオプション〕…〕

 SQLコンパイルオプション::={ISOLATION データ保証レベル 〔FOR UPDATE EXCLUSIVE〕
                |OPTIMIZE LEVEL SQL最適化オプション
                         〔,SQL最適化オプション〕…
                |ADD OPTIMIZE LEVEL SQL拡張最適化オプション
                         〔,SQL拡張最適化オプション〕…
                |SUBSTR LENGTH 文字の最大長

オペランド

特定の手続きのSQLオブジェクトだけを再作成する場合に指定します。

指定された手続きのインデクス情報が有効か無効か,又はSQLオブジェクトが有効か無効かにかかわらず,必ずSQLオブジェクトを再作成します。

SQLコンパイルオプションの変更のために使用します。

認可識別子
SQLオブジェクトを再作成する手続きの所有者の認可識別子を指定します。
パブリック手続きのSQLオブジェクトを再作成する場合は,認可識別子にPUBLICを指定します。
ルーチン識別子
SQLオブジェクトを再作成する手続き名を指定します。

再作成する手続きを,手続きの所有者の認可識別子と,手続きの状態で指定します。

〔AUTHORIZATION 認可識別子〕
手続きの所有者の認可識別子を指定して,そのユーザが所有するすべての手続き(そのユーザが定義したパブリック手続きを含む)のSQLオブジェクトを再作成します。
このオペランドを省略した場合,システム内のすべての手続きのSQLオブジェクトを再作成します。
ただし,実際にSQLオブジェクトを再作成するかどうかは,ALL句,INDEX USING句の指定との組み合わせによって決まります。
認可識別子
SQLオブジェクトを再作成する手続きの所有者の認可識別子を指定します。
〔ALL|INDEX USING〔認可識別子.〕表識別子〕
どの状態の手続きの,SQLオブジェクトを再作成するかを指定します。
ALL句,INDEX USING句のどちらも指定しなかった場合,SQLオブジェクトが無効な手続きだけを再作成します。
ALL
指定した手続きのSQLオブジェクトが有効か無効か,また,インデクス情報が有効か無効かにかかわらず,すべて再作成する場合に指定します。
INDEX USING〔認可識別子.〕表識別子
インデクス情報が無効な手続きのSQLオブジェクトだけを再作成します。
インデクスの追加又は削除をした場合に,手続きのSQLオブジェクト中のインデクス情報が無効となるため,インデクスを追加又は削除した実表の表識別子を指定して,その表を使用するSQLオブジェクトでインデクス情報が無効なすべての手続きのSQLオブジェクトを再作成します。
なお,手続きのSQLオブジェクト中のインデクス情報だけが無効な場合でも,その手続きを実行できますが,インデクス情報が有効な場合の方が性能は良くなります。
指定した実表又はビュー表を基表として定義したビュー表を使用している手続きについても,インデクス情報が無効ならばSQLオブジェクトを再作成します。
INDEX USING句を指定すると,インデクス情報だけが無効な手続きのSQLオブジェクトを再作成しますが,SQLオブジェクトが無効な手続きについては再作成しません。SQLオブジェクトが無効な手続きの再作成が必要な場合は,別途,INDEX USING句を省略するか,ALL指定でALTER PROCEDUREを発行してください。
〔認可識別子.〕表識別子
SQLオブジェクトを再作成する手続きが使用する実表又はビュー表の所有者の認可識別子と表識別子を指定します。
認可識別子を省略した場合,実行ユーザの認可識別子が仮定されます。
表識別子にパブリックビューを指定する場合は,認可識別子にPUBLICを指定してください。
外部表の表識別子を指定した場合は,インデクス情報が無効になるSQLオブジェクトはないため,SQLオブジェクトの再作成はされません。
〔ISOLATION データ保証レベル 〔FOR UPDATE EXCLUSIVE〕〕
SQLのデータ保証レベルを指定します。
データ保証レベル
データ保証レベルとは,トランザクションのどの時点までデータの内容を保証するかのレベルです。次に示すデータ保証レベルを指定できます。
  • 0
    データの内容を保証しない場合に指定します。
    0レベルを指定すると,ほかのユーザが更新中のデータでも,更新完了を待たないで参照できます。ただし,参照する表が共用表の場合,ほかのユーザが排他モードでLOCK文を実行しているときには,排他解除待ちとなります。
  • 1
    検索処理の終了までデータの内容を保証したい場合に指定します。
    1レベルを指定すると,検索処理が終了するまで(HiRDBがページ,又は行を見終わるまで)一度検索したデータをほかのユーザは更新できません。
  • 2
    トランザクションの終了まで一度検索したデータの内容を保証したい場合に指定します。
    2レベルを指定すると,トランザクションが終了するまで一度検索したデータをほかのユーザは更新できません。
このオペランドを省略した場合,前回のSQLオブジェクト作成時(CREATE PROCEDURE,ALTER PROCEDURE,又はALTER ROUTINEの実行時)に指定した値が仮定されます。
データ保証レベルについては,マニュアル「HiRDB Version 8 UAP開発ガイド」を参照してください。
〔FOR UPDATE EXCLUSIVE〕
手続き中のFOR UPDATE句を指定した,又は仮定されるカーソル,及び問合せに対してSQLコンパイルオプションで指定したデータ保証レベルに関係なく常にWITH EXCLUSIVE LOCKを仮定する場合に指定します。データ保証レベルに2レベルを指定した場合,FOR UPDATE句を指定した,又は仮定されるカーソル,及び問合せにはWITH EXCLUSIVE LOCKを仮定するため,FOR UPDATE EXCLUSIVEを指定する必要はありません。SQLコンパイルオプションにデータ保証レベルを指定し,FOR UPDATE EXCLUSIVEを省略した場合,FOR UPDATE EXCLUSIVE指定なしとなります。
《クライアント環境定義との関係》
ALTER PROCEDUREに対して,PDISLLVL,PDFORUPDATEEXLOCKの指定は無効となります。
《SQLとの関係》
手続き中のSQL文に排他オプションを指定している場合はSQLコンパイルオプションで指定するデータ保証レベル,及びFOR UPDATE EXCLUSIVEから仮定する排他オプションよりSQL文に指定した排他オプションが優先されます。
〔OPTIMIZE LEVEL SQL最適化オプション〔,SQL最適化オプション〕…〕
データベースの状態を考慮して,最も効率的なアクセスパスを決定するための最適化の方法を指定します。
SQL最適化オプションは,識別子(文字列)で指定する方法と,数値で指定する方法がありますが,通常時は識別子で指定する方法をお勧めします。
省略した場合,前回のSQLオブジェクト作成時(CREATE PROCEDURE,ALTER PROCEDURE,又はALTER ROUTINE)に採用した値が仮定されます。
 
識別子で指定する場合:

OPTIMIZE LEVEL "識別子"〔,"識別子"〕…

<指定例>
  • ネストループジョイン優先とグループ分け高速化処理を適用する場合
    OPTIMIZE LEVEL "PRIOR_NEST_JOIN","RAPID_GROUPING"
  • すべての最適化を適用しない場合
    OPTIMIZE LEVEL "NONE"
<規則>
  1. 識別子は一つ以上指定してください。
  2. 識別子を二つ以上指定する場合は,コンマ(,)で区切ってください。
  3. 識別子に指定できる内容(最適化方法)ついては,「表3-2 SQL最適化オプションの指定値(ALTER PROCEDURE)」を参照してください。
  4. すべての最適化を適用しない場合は,識別子に"NONE"を指定してください。ただし,同時に"NONE"以外の識別子を指定すると,"NONE"は無効になります。
  5. 識別子は大文字及び小文字で指定できます。
  6. 同じ識別子を二つ以上指定しても,一つ指定したものとみなされますが,なるべく同じ識別子は指定しないようにしてください。
 
数値で指定する場合:

OPTIMIZE LEVEL 符号なし整数〔,符号なし整数〕…

<指定例>
  • 複数のSQLオブジェクト作成,ANDの複数インデクス利用の抑止,及び複数インデクス利用の強制を適用する場合
    符号なし整数をコンマで区切って指定する場合:
    OPTIMIZE LEVEL 4,10,16
    符号なし整数の和を指定する場合:
    OPTIMIZE LEVEL 30
  • 既に14(4+10)を指定していて,新たに16を追加する場合
    OPTIMIZE LEVEL 14,16
  • すべての最適化を適用しない場合
    OPTIMIZE LEVEL 0
<規則>
  1. バージョン06-00より前のHiRDBから,バージョン06-00以降のHiRDBにバージョンアップする場合,バージョン06-00より前の合計値指定も有効となります。最適化オプションを変更する必要がない場合は,バージョン06-00以降のHiRDBにバージョンアップしたときにこのオペランドの指定値を変更する必要はありません。
  2. 符号なし整数は一つ以上指定してください。
  3. 符号なし整数を二つ以上指定する場合は,コンマ(,)で区切ってください。
  4. 符号なし整数に指定できる内容(最適化方法)ついては,「表3-2 SQL最適化オプションの指定値(ALTER PROCEDURE)」を参照してください。
  5. すべての最適化を適用しない場合は,符号なし整数に0を指定してください。ただし,同時に0以外の識別子を指定すると,0は無効になります。
  6. 同じ符号なし整数を二つ以上指定しても,一つ指定したものとみなされますが,なるべく同じ符号なし整数は指定しないようにしてください。
  7. 複数の最適化方法を指定する場合,その符号なし整数の和を指定することもできます。ただし,同じ最適化方法の値は二つ以上足さないでください(足した結果が別の最適化方法とみなされることもあるため)。
  8. 複数の最適化方法の値を足して指定する場合,どの最適方法を指定しているのか分かりにくくなるため,コンマで区切って指定する方法をお勧めします。また,既に複数の最適化方法の値を足して指定している場合で,新たに別の最適化方法が必要になったときは,追加する値をコンマで区切って後ろに指定できます。
 
《システム定義との関係》
  1. ALTER PROCEDUREに対して,システム定義のpd_optimize_levelオぺランドの指定は無効となります。
  2. システム定義のpd_floatable_besオペランド,又はpd_non_floatable_besオペランドを指定している場合,「フロータブルサーバ対象拡大(データ取り出しバックエンドサーバ)」及び「フロータブルサーバ対象限定(データ取り出しバックエンドサーバ)」の指定は無効となります。
  3. システム定義のpd_indexlock_modeオペランドにKEYを指定している場合(インデクスキー値排他の場合),「更新SQLの作業表作成抑止」の指定は無効になります。
《クライアント環境定義との関係》
ALTER PROCEDUREに対して,PDSQLOPTLVLの指定は無効となります。
《SQLとの関係》
SQL文中にSQL最適化指定を指定している場合は,SQL最適化オプションよりもSQL最適化指定が優先されます。SQL最適化指定については,「2.24 SQL最適化指定」を参照してください。
《SQL最適化オプションの指定値》
SQL最適化オプションの指定値を次の表に示します。各最適化方法の内容については,マニュアル「HiRDB Version 8 UAP開発ガイド」を参照してください。

表3-2 SQL最適化オプションの指定値(ALTER PROCEDURE)

項番最適化方法指定値
識別子符号なし整数
1ネストループジョイン強制"FORCE_NEST_JOIN"4
2複数のSQLオブジェクト作成"SELECT_APSL"10
3フロータブルサーバ対象拡大(データ取り出しバックエンドサーバ)※1※2"FLTS_INC_DATA_BES"16
4ネストループジョイン優先"PRIOR_NEST_JOIN"32
5フロータブルサーバ候補数の拡大※2"FLTS_MAX_NUMBER"64
6ORの複数インデクス利用の優先"PRIOR_OR_INDEXES"128
7自バックエンドサーバでのグループ化,ORDER BY,DISTINCT集合関数処理※2"SORT_DATA_BES"256
8ANDの複数インデクス利用の抑止"DETER_AND_INDEXES"512
9グループ分け高速化処理"RAPID_GROUPING"1024
10フロータブルサーバ対象限定(データ取り出しバックエンドサーバ)※1※2"FLTS_ONLY_DATA_BES"2048
11データ収集用サーバの分離機能※1※2"FLTS_SEPARATE_COLLECT_SVR"2064
12インデクス利用の抑止(テーブルスキャン強制)"FORCE_TABLE_SCAN"4096
13複数インデクス利用の強制"FORCE_PLURAL_INDEXES"32768
14更新SQLの作業表作成抑止"DETER_WORK_TABLE_FOR_UPDATE"131072
15探索高速化条件の導出"DERIVATIVE_COND"262144
16スカラ演算を含むキー条件の適用"APPLY_ENHANCED_KEY_COND"524288
17プラグイン提供関数からの一括取得機能"PICKUP_MULTIPLE_ROWS_PLUGIN"1048576​
18導出表の条件繰り込み機能"MOVE_UP_DERIVED_COND"2097152​
注※1
フロータブルサーバ対象拡大(データ取り出しバックエンドサーバ),及びフロータブルサーバ対象限定(データ取り出しバックエンドサーバ)を共に指定した場合,それぞれの最適化方法は有効にはなりません。代わりに,データ収集用サーバの分離機能として動作します。
注※2
HiRDB/シングルサーバの場合,指定しても無効となります。
〔ADD OPTIMIZE LEVEL SQL拡張最適化オプション〔,SQL拡張最適化オプション〕…〕
データベースの状態を考慮して,最も効率的なアクセスパスを決定するための最適化の方法を指定します。
SQL拡張最適化オプションは,識別子(文字列)で指定する方法と,数値で指定する方法があります。
省略した場合,前回のSQLオブジェクト作成時(CREATE PROCEDURE,ALTER PROCEDURE,又はALTER ROUTINE)に採用した値が仮定されます。
 
識別子で指定する場合:

ADD OPTIMIZE LEVEL "識別子"〔,"識別子"〕…

<指定例>
  • 「コストベース最適化モード2の適用」及び「ハッシュジョイン,副問合せのハッシュ実行」を適用する場合
    ADD OPTIMIZE LEVEL "COST_BASE_2","APPLY_HASH_JOIN"
  • すべての最適化を適用しない場合
    ADD OPTIMIZE LEVEL "NONE"
<規則>
  1. 識別子は一つ以上指定してください。
  2. 識別子を二つ以上指定する場合は,コンマ(,)で区切ってください。
  3. 識別子に指定できる内容(最適化方法)ついては,「表3-3 SQL拡張最適化オプションの指定値(ALTER PROCEDURE)」を参照してください。
  4. すべての最適化を適用しない場合は,識別子に"NONE"を指定してください。
  5. 識別子は大文字及び小文字で指定できます。
  6. 同じ識別子を二つ以上指定しても,一つ指定したものとみなされますが,なるべく同じ識別子は指定しないようにしてください。
 
数値で指定する場合:

ADD OPTIMIZE LEVEL 符号なし整数〔,符号なし整数〕…

<指定例>
  • 「コストベース最適化モード2の適用」及び「ハッシュジョイン,副問合せのハッシュ実行」を適用する場合
    ADD OPTIMIZE LEVEL 1,2
  • すべての最適化を適用しない場合
    ADD OPTIMIZE LEVEL 0
<規則>
  1. 符号なし整数は一つ以上指定してください。
  2. 符号なし整数を二つ以上指定する場合は,コンマ(,)で区切ってください。
  3. 符号なし整数に指定できる内容(最適化方法)ついては,「表3-3 SQL拡張最適化オプションの指定値(ALTER PROCEDURE)」を参照してください。
  4. すべての最適化を適用しない場合は,符号なし整数に0を指定してください。
  5. 同じ符号なし整数を二つ以上指定しても,一つ指定したものとみなされますが,なるべく同じ符号なし整数は指定しないようにしてください。
 
《システム定義との関係》
ALTER PROCEDUREに対して,システム定義のpd_optimize_levelオぺランドの指定は無効となります。
《クライアント環境定義との関係》
ALTER PROCEDUREに対して,PDADDITIONALOPTLVLの指定は無効となります。
《SQLとの関係》
SQL文中にSQL最適化指定を指定している場合は,SQL最適化オプションよりもSQL最適化指定が優先されます。SQL最適化指定については,「2.24 SQL最適化指定」を参照してください。
《SQL拡張最適化オプションの指定値》
SQL拡張最適化オプションの指定値を次の表に示します。各最適化方法の内容については,マニュアル「HiRDB Version 8 UAP開発ガイド」を参照してください。

表3-3 SQL拡張最適化オプションの指定値(ALTER PROCEDURE)

項番最適化方法指定値
識別子符号なし整数
1コストベース最適化モード2の適用"COST_BASE_2"1
2ハッシュジョイン,副問合せのハッシュ実行"APPLY_HASH_JOIN"2
3値式に対する結合条件適用機能"APPLY_JOIN_COND_FOR_VALUE_EXP"32
4ジョインを含むSQL文の外部サーバ実行の抑止"DETER_JOIN_SQL"67108864​
5直積を含むSQL文の外部サーバ実行の強制"FORCE_CROSS_JOIN_SQL"134217728​
6無条件に生成する,外部サーバで実行できる探索高速化条件の導出の抑止"DETER_FSVR_DERIVATIVE_COND"1073741824​
注1
項番2~6は,「コストベース最適化モード2の適用」を指定した場合,有効となります。
注2
項番4~6は,外部表を検索する場合に有効となる最適化です。それ以外の場合は無効となります。
〔SUBSTR LENGTH 文字の最大長〕
1文字を表現する最大バイト数を指定します。
文字の最大長に指定できる値は,3~6です。
pdntenvコマンド(UNIX版の場合はpdsetupコマンド)で文字コード種別にutf-8を指定した場合にだけ有効となり,スカラ関数SUBSTRの結果の長さに影響します。SUBSTRについては,「2.16.1(21) SUBSTR」を参照してください。
<規則>
バージョン08-00より前のHiRDBからバージョン08-00以降のHiRDBにバージョンアップする場合は,3を仮定します。文字の最大長を変更する必要がない場合は,バージョン08-00以降のHiRDBにバージョンアップしたときにこのオペランドを指定する必要はありません。
《システム定義との関係》
ALTER PROCEDUREに対して,システム定義のpd_substr_lengthオぺランドの指定は無効となります。pd_substr_lengthオぺランドについては,マニュアル「HiRDB Version 8 システム定義」を参照してください。
《クライアント環境定義との関係》
ALTER PROCEDUREに対して,PDSUBSTRLENの指定は無効となります。PDSUBSTRLENについては,マニュアル「HiRDB Version 8 UAP開発ガイド」を参照してください。
《pdntenvコマンド又はpdsetupコマンドで指定した文字コード種別との関係》
文字コード種別にutf-8を指定した場合だけ有効になります。
そのほかの文字コード種別の場合は,構文チェックだけ行い,指定を無視します。
このオペランドを省略した場合,前回のSQLオブジェクト作成時(CREATE PROCEDURE,ALTER PROCEDURE,又はALTER ROUTINEの実行時)に指定した値が仮定されます。

共通規則

  1. ALTER PROCEDUREでSQLコンパイルオプションを指定する場合,再作成する手続きの元のCREATE PROCEDUREにSQLコンパイルオプションを反映してできるSQL文は,SQL文の最大長を超えないようにしてください。
  2. 次の条件では,Java手続きからALTER PROCEDUREを実行できません。
    • 実行中のSQLオブジェクトが再作成になる場合

留意事項

  1. ALTER PROCEDUREは,OLTP下のX/Openに従ったUAPから指定できません。
  2. 複数の手続きのSQLオブジェクトを再作成する場合,手続きごとに自動的にCOMMIT文,又はROLLBACK文が実行されます。
  3. ALTER PROCEDURE実行直後にGET DIAGNOSTICS文を実行すると,ALTER PROCEDUREの診断情報が取得できます。このとき,再作成が正常終了した手続きのSQLコードは0となります。
  4. 手続き中のSQL文のデータ保証レベル,SQL最適化オプション,SQL拡張最適化オプション,及び文字の最大長は,ルーチンの定義時,又は再作成時の指定で決まり,手続き呼出し時のシステム定義やクライアント環境定義の影響を受けません。
  5. Java手続き及びJava関数はSQLオブジェクトが作成されないため,SQLオブジェクトの再作成はしません。SQLコンパイルオプションの更新だけできます。
  6. ルーチン識別子には,トリガ動作手続きの識別子は指定できません。トリガのSQLオブジェクトを再作成するには,ALTER ROUTINE又はALTER TRIGGERを使用してください。
  7. 他ユーザが定義したパブリック手続きのSQLオブジェクトを再作成した場合も,そのSQLオブジェクトの定義者は変わりません

使用例

  1. ユーザ(USER1)の手続き(PROC1)をデータ保証レベル1で再作成します。

     ALTER PROCEDURE
         USER1.PROC1 ISOLATION 1

  2. ユーザ(USER1)の表(T1)を参照するユーザ(USER1)の有効な手続きのSQLオブジェクトの中で,インデクス情報が無効となっている手続きを再作成します。

     ALTER PROCEDURE
         AUTHORIZATION USER1 INDEX USING USER1.T1

  3. すべての手続きの中で,SQLオブジェクトが無効となっている手続きを再作成します。

     ALTER PROCEDURE