none
Oracle 「%rowtype」への対応 RRS feed

  • 質問

  • OracleからSQL Serverへの移行可否検証を行なっています。

     PL/SQLのカーソルをSQL Serverに移行させていますが、Oracleの「%rowtype」、「特
    別なrow」機能などに対応するものがSQL Serverには用意されてないとのことで、全ての
    列項目の変数定義を行ない、取り敢えずSS化させて実行することができました。

     当方が利用しているSSは2012のEvaluation版ですが、最新版では以下のOracleサン
    プルスクリプトに示した①から⑤の機能に対応する表記法があるでしょうか。
     
     特に「%rowtype」は多用しており、テーブル仕様変更時には難なく対応できていますが、
    SS化後の対応漏れが懸念されます。
     宜しくお願いします。

    /*
    主テーブル:mastblと従テーブル:wmastblは同一仕様。
    テーブル仕様:顧客番号、基準日、
           列項目A~列項目Zは全て異動日。
    従テーブルの異動日項目を主テーブルに反映させる。
    */
    declare
    wupkbn   number(01);
    wcnt     number(10);
    wuncnt   number(10);
    wupcnt   number(10);
    cursor  curmas is
    select  *
      from  mastbl;
    masrec  curmas%rowtype;  -- ①カーソル取得格納領域
    wmasrec wmastbl%rowtype; -- ②従テーブル格納領域

    begin
    open  curmas;
    wcnt   := 0;
    wuncnt := 0;
    wupcnt := 0;

    loop
    fetch  curmas  into  masrec; -- ③1行分領域格納
    exit  when  curmas%notfound;
    wcnt    := wcnt  +  1;
    wupkbn  := 0;

    begin
    select  *  into  wmasrec  -- ④従テーブル領域格納
      from  wmastbl
      where  masrec.顧客番号 = 顧客番号;
    wupkbn  := 1;
    exception
      when  no_data_found  then
        wuncnt  :=  wuncnt  +  1;
    end;

    if  wupkbn  =  0  then
        goto  next;
    end if;

    if  masrec.列項目A  < wmasrec.列項目A  then
          masrec.列項目A  := wmasrec.列項目A;
          wupkbn  := 2;
    end  if;
              :
         (列項目B~列項目Yまで同様式)
              :
    if  masrec.列項目Z  < wmasrec.列項目Z  then
          masrec.列項目Z  := wmasrec.列項目Z;
          wupkbn  := 2;
    end  if;

    if  wupkbn  =  2  then
          masrec.基準日  := wmasrec.基準日;
          update  mastbl
            set  row  =  masrec  -- ⑤行をまとめて更新
          where  masrec.顧客番号 = 顧客番号;
          wupcnt  :=  wupcnt +  1;
          wccnt   :=  wccnt  +  1;
      end  if;
    end  if;

    <<next>>
    null;
    end  loop;
    close curmas;
    commit;

    dbms_output.put_line('   mastbl_読込件数=' || wcnt);
    dbms_output.put_line('   mastbl_更新件数=' || wupcnt);
    dbms_output.put_line('   mastbl_不突件数=' || wuncnt);
    end;
    /

    2019年12月1日 8:58

回答

  • Harukaさん、ご苦労様です。

    列項目追加などのテーブル仕様変更に際してシステム変更が容易なOracleでの「%rowtype」や「%type」表記と同様の機能を有するSQL Server独自の表記法は無いとのこと、了解しました。

    近い将来にバージョンアップされるであろうT-SQLの機能拡張に期待します。

    ありがとうございました。
    • 回答としてマーク trkntrkn 2019年12月16日 8:47
    2019年12月16日 8:36

すべての返信

  • trkntrknさん、こんにちは。フォーラムオペレーターのHarukaです。
    MSDNフォーラムにご投稿くださいましてありがとうございます。

    ご説明によると、OracleからSQL Serverへの移行を希望します。 もちろんできます。 
    下記、いくつかの記事をご参照してください。

    SQL Server への Oracle のデータの移行 (OracleToSQL)
    Migrating an Oracle Database to SQL Server with Microsoft Data Migration Assistant – Installation Process and Short Overview(英語)

    申し訳ございませんが、私はOracleが得意ではなく、「%rowtype」がわかりません。 
    その効果についてご説明いただけますでしょうか。

    ちなみに、T-sqlとPL-sqlは多少似ていますが、同一ではありません。 
    SQLサーバーに同等の機能がない場合でも、他の機能に置き換えることができると確信しています。

    どうぞよろしくお願いいたします。

    MSDN/ TechNet Community Support Haruka
    ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    2019年12月4日 8:42
    モデレータ
  •  Harukaさん、ご苦労様です。
     
     質問時に提示させていただいたサンプルスクリプトの①から④で「%rowtype」の表記と
    利用を行ない若干のコメントを付していますが、「%rowtype」をより理解していただける
    ようにと補足説明を書き始めてみました。
     業務システム開発時に多用しているものの、これをいざ説明しようとすると、中々上手く
    書き表すことができず「書いたり消したり。」で前に進みませんでした。
     
     そこでネット検索を行ったところ、図も掲載した分かり易い以下のサイトがありました。
     https://www.atmarkit.co.jp/ait/articles/1707/06/news003.html
     お手数をお掛けして申し訳ありませんが、参照していただければと思います。
     
     また、②のカーソル以外の「%rowtype」利用方法が、書籍『ユーザ目線のSQL等活用
    術』の『コラム:「%rowtype」属性と「%type」属性』(p104)にも記載されていました。
     書籍紹介サイト:  https://www/tokyotosho.co.jp/info/bus/y08.html
     
     宜しくお願いします。

     なお、本来の半角サイトの記載が、「Webページからのメッセージ」で
    「お客様のアカウントが確認されるまで、本文に画像やリンクを含むことはできません。」
    で投稿できませんので、取り急ぎ全角で記載しました。

    2019年12月10日 8:49
  • trkntrknさん、こんにちは。フォーラムオペレーターのHarukaです。
    ご返信いただきありがとうございます。

    SQL Serverでは、「%rowtype」は使用されません。 
    データタイプと変数を宣言する必要があります。 たとえば、‘declare @value int’。

    実際の使用では、テーブル構造(データタイプ)を変更することはお勧めしません。 
    私たちが作成するテーブルは要件分析の後に作成されるので、理にかなっていると思います。 
    もちろん、2つの値を比較する必要がある場合は、CASTとCONVERTを使用してデータタイプを変換してから、比較できます。

    どうぞよろしくお願いいたします。

    MSDN/ TechNet Community Support Haruka
    ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    2019年12月12日 1:42
    モデレータ
  • Harukaさん、ご苦労様です。

    列項目追加などのテーブル仕様変更に際してシステム変更が容易なOracleでの「%rowtype」や「%type」表記と同様の機能を有するSQL Server独自の表記法は無いとのこと、了解しました。

    近い将来にバージョンアップされるであろうT-SQLの機能拡張に期待します。

    ありがとうございました。
    • 回答としてマーク trkntrkn 2019年12月16日 8:47
    2019年12月16日 8:36