IBM i の既存プログラムを活かしたハイブリッド開発した際に、SQLのストアド・プロシージャや、ユーザー定義関数を作成しました。
これらを作成しているうちに、引数の数を変更するケースがあるかと思います。
例えば次の様な場合
変更前の作成時
CREATE OR REPLACE PROCEDURE
USHIDA@Q24.MY_ZEIKOMI1
(
IN IN_KING1 NUMERIC(011 ,00)
,OUT OT_KING2 NUMERIC(011 ,00)
)
LANGUAGE RPGLE
EXTERNAL NAME 'USHIDA@Q24/Q240101R(MY_ZEIKOMI)'
PARAMETER STYLE GENERAL
;
変更後の作成時
CREATE OR REPLACE PROCEDURE
USHIDA@Q24.MY_ZEIKOMI1
(
IN IN_KING1 NUMERIC(011 ,00)
,IN IN_HOGE1 CHAR(001)
,OUT OT_KING2 NUMERIC(011 ,00)
)
LANGUAGE RPGLE
EXTERNAL NAME 'USHIDA@Q24/Q240101R(MY_ZEIKOMI)'
PARAMETER STYLE GENERAL
;
変更時にUSHIDA@Q24.MY_ZEIKOMI1
の実体は、置き換えられておりません。引数の数ごとでそれぞれ、ストアド・プロシージャや関数の実体は存在しており、固有名 が別途割当られております。
次のSQLでその様子がわかります。
ストアド・プロシージャや関数の固有名を参照する
SELECT ROUTINE_NAME, SPECIFIC_NAME
,PARAMETER_STYLE, ROUTINE_TYPE
,IN_PARMS,OUT_PARMS,INOUT_PARMS
FROM QSYS2.SYSROUTINE
WHERE ROUTINE_SCHEMA = 'USHIDA@Q24'
AND ROUTINE_NAME = 'MY_ZEIKOMI1'
一つしか存在していない場合は DROP PROCEDURE
や DROP FUNCTION
で削除できますが、複数の同名が作成された場合は削除出来ません。次の様になります。
DROP失敗例
DROP PROCEDURE USHIDA@Q24.MY_ZEIKOMI1
SQL 状態: 42725 ベンダー・コード: -476 メッセージ: [SQL0476] ルーチンUSHIDA@Q24のMY_ZEIKOMI1が固有でありません。
原因--関数またはプロシージャーUSHIDA@Q24のMY_ZEIKOMI1がシグニチャーまたは特定の名前によらずに指定されていて,そのルーチンの複数のインスタンスが見つかりました。あるいは,このプロシージャーが,リモート・システムへの接続時に,スキーマ名が指定されていないDESCRIBE PROCEDUREステートメントまたはASSOCIATE LOCATORステートメントで使用され,かつその名前で複数のプロシージャーが呼び出されました。回復手順--ルーチンは,特定の名前またはシグニチャー(パラメーター・タイプ付きの関数名またはプロシージャー名)のいずれかによって要求します。これがDESCRIBE PROCEDUREステートメントまたはASSOCIATE LOCATORステートメントに対するものである場合は,プロシージャーのスキーマ名を指定してください。要求を再試行してください。
強調表示されたステートメントが正常に完了しなかったため、処理が終了しました
もしこれらを削除する時は 固有名 側で削除しなければなりません。その場合は、さきほどのSQLで参照したSPECIFIC_NAME
を指定し以下のSQL DROP SPECIFIC ~
で削除します。
DROP成功例
DROP SPECIFIC PROCEDURE USHIDA@Q24.MY_ZE00001
ステートメントは正常に実行されました (20 ミリ秒)
この様に引数毎に定義されており、意識していないと思わぬ事が起こる可能性もあるので気をつけましょう!
予め作成する際のSQLで CREATE 〜 SPECIFIC--specific-name-
を指定して任意の固有名とすることも出来ます。指定がない場合はシステムで自動的に生成されます。