2016-06-17 12 views
0

SQLRPGLEプログラム内では、新しいレコードIDが割り当てられたレコードをコピーした別のファイルにレコードをコピーするためにステートメントを挿入する必要があります。私はこれらの手順に従って、そうするには :iSeries:SQLRPGLE SELECTステートメントの各レコードのプロシージャーを呼び出す方法

1)プロトタイプたびに

 
    D ri_box12  PR   13S 0 
    D wkFileName     10A Value 
2と呼ばれる新しいレコードのIDを取得するための手順)は、動的SQL文
 
    C     EVAL  SQL_STM='insert into PGMR46/STD05GR0F' 
    C         +' (select CART, CARV, ' 
    C         +%char(ri_box12('STD05GR0F')) 
    C         +' from arasso0f)' 
    C/EXEC SQL 
    C+ execute immediate :SQL_STM 
    C/END-EXEC 
3を実行)
 
    P ri_box12  B 
    D ri_box12  PI   13S 0 
    D wkFileName     10A Value 
    D wkID   S    13S 0 
    C     DO
** ...some instructions to give wkID a value C ENDDO C Return wkID P E
ri_box12手順を定義しますポイントは、ri_box12は一度だけ呼び出されるため、すべてのコピーされたレコードは同じIDを持ちます。プログラムを複数回実行すると、新しいレコードIDを持つすべてのレコードが再度コピーされます。

私は何が間違っていたのですか、何が欠けていますか?

非常に多く

+1

私はちょうど私の手順は、SQL文の外に呼び出されたので、私はそれをやった方法が間違っていることに気づきました。ですから、可能であれば、SQLステートメント内で呼び出すことができる内部SQLRPGLEプロシージャーを定義する方法は正確にはわかりません。さもなければ、私は別の何かをするべきだと思う。何か助けてくれてありがとう – user8444

答えて

1

まず、動的SQLを使用する必要はありません。静的SQLは機能し、セキュリティとパフォーマンスの理由から静的SQLが優先されます。

/free  
exec SQL 
    insert into PGMR46/STD05GR0F 
    select CART, CARV, ri_box12('STD05GR0F') 
    from arasso0f 
end-exec; 

ただし、RPGLE機能のCALLを機能させるには、1つの機能が欠落しています。

外部ユーザー定義関数(UDF)と呼ばれるものを定義する必要があります。これは1つのタイムステップです。基本的には、RPGLE関数が存在し、そのインターフェースがどのようになっているかをSQL照会エンジンに通知しています。

通常、上記のINSERT文は、ri_box12()関数と同じプログラムには入れません。通常は

  • )ので

    1. のようなプロセスは、(ri_box12を含む*のSRVPGM(または* PGM)を作成する必要があるだろうUDFを使用するプログラム/ストアドプロシージャを作成ri_box12を指してUDF()
    2. を作成

    手順3は、INSERT SQL文を含むプログラムです。

    create function ri_box12(
        filename char(10) 
    ) returns numeric(13,0) 
        language RPGLE 
        parameter style general 
        returns null on null input 
        program type sub 
        external name 'MYSRVPGM(RIBOX_12)'; 
    

    あなたは/関数に指定する必要がありますすることができ、他の設定がたくさんあります:

    ステップ2は、単純にそうようになります。SQL文を実行しています。 SQLリファレンスマニュアルのCREATE FUNCTION (External Scalar)セクションをご覧ください。

    私も非常にExternal Procedures, Triggers, and User-Defined Functions on IBM DB2 for i Redbook

  • +0

    ありがとう、あなたの答えをありがとう。 私はSQL Reference Redbookを読んでいましたが、あなたの言葉はすべてをまとめてくれました。私は外部プログラムのUDF関数を作成せずにそれを行う方法があることを期待していました。 – user8444

    0

    わからないを読んでお勧めしたいOPからの機能ri_box12が何をするのか、しかし、その効果を達成するための可能な手段として、SQLのSEQUENCEは連続番号があるだけであれば、例えば、以下のスクリプトのSQLを参照してください。

    drop table qtemp.nbrs ;       
    drop table qtemp.junk ;       
    drop sequence myseq ;        
    create table qtemp.nbrs (n int)   ;   
    insert into qtemp.nbrs values(10), (20), (30) ; 
    create table qtemp.junk (s int, i int) ;   
    create sequence myseq as integer start with 1 ; 
    insert into qtemp.junk       
    select next value for myseq, n from qtemp.nbrs ; 
    select * from qtemp.junk 
    ; -- report from the above SELECT query follows: 
         S    I 
         1    10 
         2    20 
         3    30 
    

    IBM i 7.2->Database->Reference->SQL reference->Concepts->Sequences
    IBM i 7.2->Database->Reference->SQL reference->Statements->CREATE SEQUENCE
    IBM i 7.2->Database->Reference->SQL reference->Language elements->Expressions->Sequence reference

    +0

    こんにちはCRPence、 あなたの答えをありがとう、しかしそれは単に連続した番号ではありません。シーケンスは、文書番号付けの複雑なシステムであるため、入力パラメータに依存します。 とにかく、私は私の目的を果たしました。私はRPGLEサービスプログラムをメイン、エクスポートされたすべての関数なしで作成し、SQL関数が許されるところで動作する新しいSQL関数を作成しました。 誰かが必要な場合は、完全なコマンドと仕様を提供することができます。 ありがとう – user8444