1

PRODUCTION データベースを MSSQL から Oracle 11G に移行しています。このプロセスの一部は、TSQL から Oracle SQL へのいくつかの既存のストアド プロシージャを再作成することです。Oracle を初めて使用するので、特定の状況でのベスト プラクティスについて質問があります。

基本的に、販売トランザクション テーブルのデータを要約したテーブルがあります。テーブル(F5542HIS)の基本的なレイアウトは次のとおりです(*はインデックスを示します)。

 *NSAN8 (sold_to)
 *NSSHAN (ship_to)
 *NSMCU (sold_from)
 *NSITM (item)
 *NSCTRY (Century)
 *NSYR (year)
 *NSMNTH (month)
 *NSDCTO (Order Type)
 *NSLNTY (Order Line Sales Type)
 NSAEXP (Total Extended Price)
 NSSOQS (Total Units Shipped)
 NSECST (Total Extended Cost)

スクリプトの最初のパスで、テーブルにプライマリ インデックス値 (上記の * で示されます) を入力します。

2 回目のパスでは、このテーブルを更新して、トランザクション テーブルから合計値を入力する必要があります。トランザクション テーブルは F4211 (未処理の注文) と F42119 (注文履歴) であるため、ユニオンが必要です。

したがって、適切なデータを返す次の select ステートメントに基づいて更新を行う必要があります。

 select sum(cast(sdaexp as numeric)) sumaexp, 
        sum(cast(sduorg as numeric)) sumuorg,
        sum(cast(sdecst as numeric)) sumecst
 from PRODDTA.F4211 a inner join proddta.f5542his b 
      on(a.sdan8  = b.nsan8 and 
         a.sdshan = b.nsshan and 
         a.sditm  = b.nsitm and 
         a.sdlnty = b.nslnty and 
         a.sddcto = b.nsdcto and 
         a.sdlnty = b.nslnty and 
         ltrim(rtrim(a.sdmcu)) = ltrim(rtrim(b.nsmcu)) )
 where sdtrdj >= 108001  and 
       sdtrdj <= 108031 and 
 group by sdaexp, sduorg, sdecst 
 UNION 
 select sum(cast(sdaexp as numeric)) sumaexp, 
        sum(cast(sduorg as numeric)) sumuorg,
        sum(cast(sdecst as numeric)) sumecst
 from PRODDTA.F4211 a inner join proddta.f5542his b 
      on(a.sdan8  = b.nsan8 and 
         a.sdshan = b.nsshan and 
         a.sditm  = b.nsitm and 
         a.sddcto = b.nsdcto and 
         a.sdlnty = b.nslnty and 
         ltrim(rtrim(a.sdmcu)) = ltrim(rtrim(b.nsmcu)) )
 where sdivd >= 108001  and 
       sdivd <= 108031 and 
 group by sdaexp, sduorg, sdecst

SDTRDJ (取引日) と SDIVD (請求日) で、>= 108001 および <= 108031 の値が使用されていることに注意してください。これらはユリウス日です (ユリウス日ではありません)。日付を保持する奇妙な方法ですが、うまくいきます。108001 = 2008 年 1 月 1 日、および 108031 = 2008 年 1 月 31 日。

また、F5542HIS テーブルには、NSCTRY (世紀) = 20、NSYR (年) = 8、および NSMNTH (月) = 1 であるこの例の更新に関する WHERE 句があります。基本的に、構造は次の形式になります。

UPDATE f5542HIS
SET nsaexp=sumaexp, nsuorg-sumuorg, nsecst=sumecst from<union>
where nsctry=20 and nsyr=8 and nsmnth=1

私はSQLUpdateとSQLMERGE関数を見てきました。UPDATEこのステートメントをまたはここで機能するようにフォーマットするためのベストプラクティスを定義するのを手伝ってくれる人はいMERGEますか?

4

0 に答える 0