($title_img_alt)

こちらからの投稿は、先頭に表示されているコメントへの返信になります。
SQLRPGLEへの動的SQLへの組込方について AS400 初心者 さん [ 1月27日(水) 17時40分 ]
いつもお世話になっております。


ユーザーの操作によって、動的に条件文を作成し
その結果を文字型の変数にまとめたものを
EXEC SQLでのSQL実行時にWHERE文として指定したいのですが
どのように記載すればよろしいでしょうか?

例)
STRSQLという文字型変数に、ユーザー操作による条件指定の結果を格納する
(STRSQLには、'WHERE AAA = 10 OR AAA = 15 OR AAA = 20 OR BBB = 11'が入る)

INSERT INTO LIB/FILEA SELECT AAA,BBB,CCC,DDD FROM LIB/FILEB というような
SQL文にSTRSQLの内容を結合して、結果としては下記のようなSQLの実行を行い
たいです。

INSERT INTO LIB/FILEA SELECT AAA,BBB,CCC,DDD FROM LIB/FILEB
WHERE AAA = 10 OR AAA = 15 OR AAA = 20 OR BBB = 11

RE:SQLRPGLEへの動的SQLへの組込方について AS400初心者 さん [ 1月28日(木) 9時59分 ]
?の理解で合っているかはわかりませんが、動的なSQL自体は実行出来ました。
ただ、2点気になるところがあります。
?の部分について、質問させて下さい。

------------------------------------------------------------
?
//TESTSQL(文字型の変数)をPREPARE文でSTMT1というSQL文に設定する
EXEC SQL PREPARE STMT1 FROM :TESTSQL;

//上記で設定したSTMT1というSQL文をEXECUTE文で実行する
EXEC SQL EXECUTE STMT1;

※TESTSQLには、'INSERT INTO LIB/FILEA SELECT AAA,BBB,CCC FROM LIB/FILEB
 WHERE AAA = 10 OR AAA = 15' が入っている状態
------------------------------------------------------------
?
 1.SQL実行後にデータ追加先のファイルがロックされたままになっている。
   サインオフするとファイルのロックが解除されます。   

   WRKOBJLCKで確認すると下記の状況でした
     ロック :*SHRRD
     状況  :HELD
     有効範囲:*JOB

 2.SQL実行時にファイルにINSERTされていない時がある
   (誰も使用していないファイルで、かつ追加先のファイルはデータが0件の
    状態です。また、INSERTされていない時に再度同じプログラムを実行
すると
    データが追加されます)

------------------------------------------------------------

?の2も気になりますが、?の1の方がまったく解決方法がわからず困っていま
す。。
私のやり方がよくないのかもしれませんが、RPG終了時にファイルロックが解
放されるようにするには
どのようにすればいいかご助言いただけないでしょうか?

宜しくお願い致します。


RE:SQLRPGLEへの動的SQLへの組込方について AS400初心者 さん [ 1月28日(木) 10時58分 ]
> 下記1の理解で合っているかはわかりませんが、動的なSQL自体は実行出
来ました。
> ただ、2点気になるところがあります。
> 下記2の部分について、質問させて下さい。
> 
> ------------------------------------------------------------
> 1
> //TESTSQL(文字型の変数)をPREPARE文でSTMT1というSQL文に設定する
> EXEC SQL PREPARE STMT1 FROM :TESTSQL;
> 
> //上記で設定したSTMT1というSQL文をEXECUTE文で実行する
> EXEC SQL EXECUTE STMT1;
> 
> ※TESTSQLには、'INSERT INTO LIB/FILEA SELECT AAA,BBB,CCC FROM 
LIB/FILEB
>  WHERE AAA = 10 OR AAA = 15' が入っている状態
> ------------------------------------------------------------
> 2
>  1.SQL実行後にデータ追加先のファイルがロックされたままになっている。
>    サインオフするとファイルのロックが解除されます。   
> 
>    WRKOBJLCKで確認すると下記の状況でした
>      ロック :*SHRRD
>      状況  :HELD
>      有効範囲:*JOB
> 
>  2.SQL実行時にファイルにINSERTされていない時がある
>    (誰も使用していないファイルで、かつ追加先のファイルはデータが
0件の
>     状態です。また、INSERTされていない時に再度同じプログラムを実行
> すると
>     データが追加されます)
> 
> ------------------------------------------------------------
> 
> 私のやり方がよくないのかもしれませんが、下記2点について
> ご助言いただけないでしょうか?
>
>  ・RPG終了時にファイルロックが解放されるようにする方法
>  ・2回に1回しかSQLが実行されない状態の解決方法
> 
> 宜しくお願い致します。
> 
> 
> 
RE:SQLRPGLEへの動的SQLへの組込方について IKD さん [ 1月28日(木) 14時59分 ]
「サインオフするとファイルのロックが解除されます」という症状から推察すると
LR-終了していない、つまりプログラムが正常終了しないでスタックの残ったままに
なっている、という可能性がかなり高いです。

ロックを解放する方法ではなく、ご自分のプログラムの基本ができているかを
よく調査しましょう。
RE:SQLRPGLEへの動的SQLへの組込方について AS400初心者 さん [ 1月28日(木) 17時38分 ]
はじめにそれを疑いました。
実際のソースは、下記のような構成になっているため、
LR終了はしていました。
--------------
EXSR SQL;
*INLR = *ON;
RETURN;
--------------

それで色々継続して試した結果、COMMITを入れると
ファイルのロック自体は解除されるようになりました。

EXEC SQL PREPARE STMT1 FROM :STRSQL;
EXEC SQL EXECUTE STMT1;
EXEC SQL COMMIT;    ←この文を追加しました。

バグ となり さん [ 1月28日(木) 15時23分 ]
丁寧にDEBUGしてください。
コンパイル時のCOMMIT値は? @445 さん [ 1月28日(木) 15時57分 ]
コンパイル時 COMMIT(*NONE) ですか?
RE:コンパイル時のCOMMIT値は? AS400初心者 さん [ 1月28日(木) 17時44分 ]
> コンパイル時 COMMIT(*NONE) ですか?

質問投稿させていただいた時は、COMMIT(*CHG)でした。

色々試す中で、COMMIT(*NONE)にすると
データが追加されないことがあるという現象は発生しなくなりました。

COMMIT(*NONE)でも問題はないのでしょうか?
RE:コンパイル時のCOMMIT値は? IKD さん [ 1月28日(木) 21時3分 ]
SQLバインドのプログラムをコンパイルするときには
COMMIT を使っていないのであれば COMMIT *NONE でコンパイルするのが
正しいやり方です。

COMMIT は SQL での更新をロール・バック(ROLLBK=元に戻す) ために
ヒストリーにログを書くために使用するだけです。

どのような業務で更新されているのか不明ですが
SQL 更新の場合、ひとつひとつの UPDATE/INSERT を行って
複数のファイルを更新していくと、どれかの更新が失敗すれば
既に更新した他の更新も元に戻さないと整合性が取れなくなってしまう場合があります。

このようなときのために COMMIT から次の COMMIT のあいだまでに
問題が発生すれば ROLLBK で元に戻すことができます。
ただし COMMIT を使う場合は環境の用意も必要です。

このように複数のファイルを更新しているのでなければ COMMIT は *NONE で
問題はありません。

ただし、SQL による COMMIT/ROLLBK の更新はパフォーマンスも低下しますし
メモリも大量に消費します。
前時代的な方法ですのであまりお勧めはできません。
RE:コンパイル時のCOMMIT値は? AS400初心者 さん [ 1月29日(金) 9時41分 ]
詳しく教えていただきありがとうございます。
非常に勉強になりました。

今回しようと思っていることは、
 1.画面内の8項目くらいを表示
 2.項目でファンクションキーを押下するとその項目のポップアップに
   一覧を表示
 3.その一覧で選択された値が(複数、飛び石可)その項目の抽出条件
 4.8項目でそれぞれ動的に設定された値を1つのWHERE文として変数に格納
 5.SQL文を実行(ここでWKに抽出結果を書き込み)
 6.RPGで再度抽出


という流れになります。
3の部分をRPGでやるよりはSQLで出来る方が開発工数や、実行速度という観点で
良いのではと思い、色々試行錯誤して作成していました。


>ただし COMMIT を使う場合は環境の用意も必要です

1点、ご説明いただいた中で質問させていただきたいのですが
こちらの環境というのは、ジャーナルファイルが必要ということでしょうか?
RE:コンパイル時のCOMMIT値は? IKD さん [ 1月29日(金) 11時2分 ]
COMMIT *NONE でコンパイルした SQLRPGLE の実行にはジャーナルは必要ありません。

COMMIT を使う場合はもちろんジャーナルが必要となります。
ジャーナルには SQL での更新前と更新後のログが記録されますので
ROLLBK できるようになるわけです。
従って COMMIT *NONE であればジャーナルは必要ありません。

上記のご説明の部分で 2 の POPUPにデータを抽出して表示するために
SQL を利用するのではないのですね ?

小職が少し前に開発したストアド・プロシージャーでは SQL 文で
上記のように POPUPを表示するシステムを開発したものですから。
RE:コンパイル時のCOMMIT値は? AS400初心者 さん [ 1月29日(金) 11時55分 ]
はい。POPUPの部分はSQLではなくRPGで行っています。
幸いPOPUPに表示するのはマスターからのシンプルで静的な抽出条件でしたので。


*NONE以外でのCOMMIT時はやはりジャーナルが必要ということで了解いたしま
した。

詳細なご説明に加えて、参考になるお話もいただき
ありがとうございました。

 

お名前

パスワード

メールアドレス

タイトル

ホームページ

アドレス

項目