($title_img_alt)

こちらからの投稿は、先頭に表示されているコメントへの返信になります。
サブクエリでOBRDBF(&MBR) T.K. さん [ 8月24日(水) 18時34分 ]
お世話になります。

RPGLEのSQLでのファイル一時変更(OVRDBF)について、
どなたかご存知の方がいらしたらご教示ください。

今、あるファイル(PF=F1およびそのPFのLF=F1L1)に、
以下のようにメンバーを追加して、

(PF) ADDPFM F1 M0001
(LF) ADDLFM F1L1 M0001 DTAMBRS((F1 (M0001))

その後
OVRDBF F1 TOFILE(F1) MBR(M0001)
OVRDBF F1L1 TOFILE(F1L1) MBR(M0001)
のように一時変更した後で、

物理ファイルであるF1と論理ファイルであるF1L1の
サブクエリをJOINするようなSQLを実行したところ、
物理ファイルF1の一時変更は正しく反映されていましたが、
論理ファイルであるF1L1の一時変更は効いておらず、
*FIRSTメンバーが開かれていました。(SYSREQ-3-14で確認)

また、試しに、ファイルを入れ替えて、
物理ファイルであるF1をサブクエリのファイルにしたところ、
こんどはF1の一時変更が効いておらず、
やはり*FIRSTメンバーが開かれていました。

私の勘違いであれば申し訳ありません。

そうでない場合、回避する方法はあるでしょうか?
ちなみに一時変更先のメンバー名は固定ではなく、
変数として処理します。

以上、ご存じのかたがあればよろしくお願いいたします。
RE:サブクエリでOBRDBF(&MBR) IKD さん [ 8月25日(木) 9時51分 ]
ご質問に当たっては肝心要なところを「サブクエリ」とういう曖昧模糊な表現に
してしまっては駄目です。

肝心なところをボヤかして適切な回答は得られません。
実際に近い具体的なSQL文の表現で
バインドSQL なのかどうかも説明不足

RE:サブクエリでOBRDBF(&MBR) T.K さん [ 8月26日(金) 12時2分 ]
> お世話になります。
> 
> RPGLEのSQLでのファイル一時変更(OVRDBF)について、
> どなたかご存知の方がいらしたらご教示ください。
> 
> 今、あるファイル(PF=F1およびそのPFのLF=F1L1)に、
> 以下のようにメンバーを追加して、
> 
> (PF) ADDPFM F1 M0001
> (LF) ADDLFM F1L1 M0001 DTAMBRS((F1 (M0001))
> 
> その後
> OVRDBF F1 TOFILE(F1) MBR(M0001)
> OVRDBF F1L1 TOFILE(F1L1) MBR(M0001)
> のように一時変更した後で、
> 
> 物理ファイルであるF1と論理ファイルであるF1L1の
> サブクエリをJOINするようなSQLを実行したところ、
> 物理ファイルF1の一時変更は正しく反映されていましたが、
> 論理ファイルであるF1L1の一時変更は効いておらず、
> *FIRSTメンバーが開かれていました。(SYSREQ-3-14で確認)
> 
> また、試しに、ファイルを入れ替えて、
> 物理ファイルであるF1をサブクエリのファイルにしたところ、
> こんどはF1の一時変更が効いておらず、
> やはり*FIRSTメンバーが開かれていました。
> 
> 私の勘違いであれば申し訳ありません。
> 
> そうでない場合、回避する方法はあるでしょうか?
> ちなみに一時変更先のメンバー名は固定ではなく、
> 変数として処理します。
> 
> 以上、ご存じのかたがあればよろしくお願いいたします。

質問の内容が曖昧で申し訳ありません。

実際は以下のようなSQLの宣言です。
項目名などは変えましたが構造については実際動作しているものです。

C/EXEC SQL
C+
C+ DECLARE C1 CURSOR FOR
C+
C+ SELECT B.CNT, B.MNSQ, B.MXSQ, A.*
C+
C+ FROM FILE1L1 A
C+
C+ LEFT JOIN
C+ (
C+  SELECT
C+        COUNT(*) AS CNT,
C+        MIN(CRSQ) AS MNSQ,
C+        MAX(CRSQ) AS MXSQ,
C+        CRTP, DIR, USER, JOB, JOBN, IITM, ILOT
C+  FROM  FILE1
C+  WHERE CRTP = :PMCRTP AND
C+        DIR  = :PMDIR  AND
C+        USER = :PMCUSR AND
C+        JOB  = :PMCJOB AND
C+        JOBN = :PMCJBN AND
C+        LVL  = 0       AND
C+        DMYF = 0
C+  GROUP BY
C+        CRTP, DIR, USER, JOB, JOBN, IITM, ILOT
C+ ) B
C+
C+ ON     A.CRTP = B.CRTP AND
C+        A.DIR  = B.DIR  AND
C+        A.USER = B.USER AND
C+        A.JOB  = B.JOB  AND
C+        A.JOBN = B.JOBN AND
C+        A.IITM = B.IITM AND
C+        A.ILOT = B.ILOT
C+
C+ WHERE  A.LVL  = 0       AND
C+        A.DMYF = 0       AND
C+        A.CRTP = :PMCRTP AND
C+        A.DIR  = :PMDIR  AND
C+        A.USER = :PMCUSR AND
C+        A.JOB  = :PMCJOB AND
C+        A.JOBN = :PMCJBN
C+
C+ ORDER BY
C+        A.CRTP, A.DIR,  A.USER, A.JOB, A.JOBN,
C+        A.IITM, A.ILOT, A.CRSQ
C+
C/END-EXEC

上記のようなSQLで、FILE1が物理ファイル、
FILE1L1がその物理ファイルを基礎としている論理ファイルです。

業務的な要件は説明できませんが、
FILE1のデータを自身のデータの条件でグループ化し、
件数/最小値/最大値も計算したデータを読込んで
順次処理したい、という意図です。

上の事はこのSQLカーソルC1をOPENした際に起こるようなのです。

何かお分かりの方がいらしたら、よろしくお願いいたします。
RE:サブクエリでOBRDBF(&MBR) T.K さん [ 8月26日(金) 13時24分 ]
> > お世話になります。
> > 
> > RPGLEのSQLでのファイル一時変更(OVRDBF)について、
> > どなたかご存知の方がいらしたらご教示ください。
> > 
> > 今、あるファイル(PF=F1およびそのPFのLF=F1L1)に、
> > 以下のようにメンバーを追加して、
> > 
> > (PF) ADDPFM F1 M0001
> > (LF) ADDLFM F1L1 M0001 DTAMBRS((F1 (M0001))
> > 
> > その後
> > OVRDBF F1 TOFILE(F1) MBR(M0001)
> > OVRDBF F1L1 TOFILE(F1L1) MBR(M0001)
> > のように一時変更した後で、
> > 
> > 物理ファイルであるF1と論理ファイルであるF1L1の
> > サブクエリをJOINするようなSQLを実行したところ、
> > 物理ファイルF1の一時変更は正しく反映されていましたが、
> > 論理ファイルであるF1L1の一時変更は効いておらず、
> > *FIRSTメンバーが開かれていました。(SYSREQ-3-14で確認)
> > 
> > また、試しに、ファイルを入れ替えて、
> > 物理ファイルであるF1をサブクエリのファイルにしたところ、
> > こんどはF1の一時変更が効いておらず、
> > やはり*FIRSTメンバーが開かれていました。
> > 
> > 私の勘違いであれば申し訳ありません。
> > 
> > そうでない場合、回避する方法はあるでしょうか?
> > ちなみに一時変更先のメンバー名は固定ではなく、
> > 変数として処理します。
> > 
> > 以上、ご存じのかたがあればよろしくお願いいたします。
> 
> 質問の内容が曖昧で申し訳ありません。
> 
> 実際は以下のようなSQLの宣言です。
> 項目名などは変えましたが構造については実際動作しているものです。
> 
> C/EXEC SQL
> C+
> C+ DECLARE C1 CURSOR FOR
> C+
> C+ SELECT B.CNT, B.MNSQ, B.MXSQ, A.*
> C+
> C+ FROM FILE1L1 A
> C+
> C+ LEFT JOIN
> C+ (
> C+  SELECT
> C+        COUNT(*) AS CNT,
> C+        MIN(CRSQ) AS MNSQ,
> C+        MAX(CRSQ) AS MXSQ,
> C+        CRTP, DIR, USER, JOB, JOBN, IITM, ILOT
> C+  FROM  FILE1
> C+  WHERE CRTP = :PMCRTP AND
> C+        DIR  = :PMDIR  AND
> C+        USER = :PMCUSR AND
> C+        JOB  = :PMCJOB AND
> C+        JOBN = :PMCJBN AND
> C+        LVL  = 0       AND
> C+        DMYF = 0
> C+  GROUP BY
> C+        CRTP, DIR, USER, JOB, JOBN, IITM, ILOT
> C+ ) B
> C+
> C+ ON     A.CRTP = B.CRTP AND
> C+        A.DIR  = B.DIR  AND
> C+        A.USER = B.USER AND
> C+        A.JOB  = B.JOB  AND
> C+        A.JOBN = B.JOBN AND
> C+        A.IITM = B.IITM AND
> C+        A.ILOT = B.ILOT
> C+
> C+ WHERE  A.LVL  = 0       AND
> C+        A.DMYF = 0       AND
> C+        A.CRTP = :PMCRTP AND
> C+        A.DIR  = :PMDIR  AND
> C+        A.USER = :PMCUSR AND
> C+        A.JOB  = :PMCJOB AND
> C+        A.JOBN = :PMCJBN
> C+
> C+ ORDER BY
> C+        A.CRTP, A.DIR,  A.USER, A.JOB, A.JOBN,
> C+        A.IITM, A.ILOT, A.CRSQ
> C+
> C/END-EXEC
> 
> 上記のようなSQLで、FILE1が物理ファイル、
> FILE1L1がその物理ファイルを基礎としている論理ファイルです。
> 
> 業務的な要件は説明できませんが、
> FILE1のデータを自身のデータの条件でグループ化し、
> 件数/最小値/最大値も計算したデータを読込んで
> 順次処理したい、という意図です。
> 
> 上の事はこのSQLカーソルC1をOPENした際に起こるようなのです。
> 
> 何かお分かりの方がいらしたら、よろしくお願いいたします。
> 

たびたび申し訳ありません。
大事なことを記述し忘れました。

OS/400のバージョンは古くて V5R4M0 です。
RE:サブクエリでOBRDBF(&MBR) IKD さん [ 8月26日(金) 15時27分 ]
[ OVRDBF のファイル名と SQL文のファイル名が異なっている ]

ご示し頂いた記述に間違いがなければ
上記は要約すると


OVRDBF F1 TOFILE(F1) MBR(M0001)
OVRDBF F1L1 TOFILE(F1L1) MBR(M0001)
 :
SELECT ...
FROM FILE1L1 
FROM  FILE1

ということになりますが SQLでは FILE1 ですが
実際に OVRDBF しているのは F1L1 であり、名前が異なっていますが
現実のソースもこのように異なっているようなことはありませんか ?

 (もちろん異なっている場合は期待通りの OVRDBF は
 効力を発揮しません)
RE:サブクエリでOVRDBF(&MBR) T.K さん [ 8月26日(金) 17時0分 ]
> [ OVRDBF のファイル名と SQL文のファイル名が異なっている ]
> 
> ご示し頂いた記述に間違いがなければ
> 上記は要約すると
> 
> 
> OVRDBF F1 TOFILE(F1) MBR(M0001)
> OVRDBF F1L1 TOFILE(F1L1) MBR(M0001)
>  :
> SELECT ...
> FROM FILE1L1 
> FROM  FILE1
> 
> ということになりますが SQLでは FILE1 ですが
> 実際に OVRDBF しているのは F1L1 であり、名前が異なっていますが
> 現実のソースもこのように異なっているようなことはありませんか ?
> 
>  (もちろん異なっている場合は期待通りの OVRDBF は
>  効力を発揮しません)

実際にはこのSQLを組み込んだプログラムは、
メインでCALLされるプログラムからは4階層目でCALLされるのですが、
メインでCALLされるプログラムでは、
DSPDBRの*OUTFILEから物理ファイルとそれを基礎とする全論理ファイルに
メンバーを追加し、その後追加したメンバーに対してOVRDBFを行っています。
論理ファイル名は*OUTFILEのWHREFIを使用しており、
論理ファイルのメンバーと物理ファイルのメンバーは正しくつながっていました。
また、OVRDBF OVRSCOPE=*JOB、SECURE=*YESとしています。

メインのプログラムの時点でSYSREQ-15を見ると物理ファイルと全ての論理ファイルに
意図したメンバーで一時変更がかかっていることになっており、
SQLを組込んだプログラムの実行前、実行後でもそれは変わっていませんでした。

不可解なのは、このSQLでメインのファイルとサブクエリ側のファイルの記述を逆にしたときに、
やはりサブクエリ側に記述したファイルに対してこれが起こっているという点です。

何かお気づきの点がおありになった方、ご指摘をよろしくお願いいたします。

自分でもさらに調べてみたいと思います。

お名前

パスワード

メールアドレス

タイトル

ホームページ

アドレス

項目