4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

IBM i の既存プログラムを活かしたハイブリッド開発(おまけ)

Last updated at Posted at 2024-12-24

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'

実際に実行すると次の様に表示されます。
20241225-01.png

一つしか存在していない場合は DROP PROCEDUREDROP FUNCTION で削除できますが、複数の同名が作成された場合は削除出来ません。次の様になります。

DROP失敗例
DROP PROCEDURE USHIDA@Q24.MY_ZEIKOMI1
SQL 状態: 42725 ベンダー・コード: -476 メッセージ: [SQL0476] ルーチンUSHIDA@Q24MY_ZEIKOMI1が固有でありません。
 原因--関数またはプロシージャーUSHIDA@Q24MY_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- を指定して任意の固有名とすることも出来ます。指定がない場合はシステムで自動的に生成されます。

4
0
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?