SAP SQL Anywhere における SELECT 文内での UPDATE 文の使用

 

この記事のオリジナルは、Glenn Paulley が sybase.com に 2009 年 5 月に掲載したものです。その中で、Glenn は SQL Anywhere version 12 で追加された機能である 様々な DML クエリーにおける SELECT文 の使用について解説しています。

 

これは非常に便利で、軽く使える機能なため、繰り返し使用する価値があります。

例えば、insert 文の一部として新たに挿入された行のプライマリーキーを簡単に返すことができます。

 

例:

  1. SELECT pkey_col FROM (INSERT INTO mytable(col2) VALUES( ‘hello’)) REFERENCING (FINAL as t_final) order by 1

 

 

2009 年 5 月のブログ記事で、クエリーの FROM 句内のテーブル表現として update DML 文を使用できる IBM DB2 製品の SQL 言語機能について賞賛しましたが、DB2 の構文を以下の簡単な例で説明します。

 

  1. SELECT T_updated.*
  2. FROM NEW TABLE ( UPDATE T SET x=7 WHERE y=6 ) AS T_updated
  3. WHERE T_updated.pk IN ( SELECT S.fk FROM S WHERE S.z = 8 )

 

この構造は、修正した行を他のテーブルに join する、cursor 経由で修正した行をアプリケーションに返す、修正した行をファイルにアウトプットする、などをとても簡単に行うことができます。

 

この拡張機能がない場合は、AFTERまたは BEFORE TRIGGERを定義して修正された行を他の(異なる)テーブルにコピーし、その別のテーブルのコンテンツを管理し(そして既存の updaters をハンドリングし)、UPDATE 文が実行された後にトリガーが挿入されたテーブルに別の SELECT 文を実行する必要があります。

これは update 文が行った変更をアウトプットするだけにもかかわらず、かなりの労力を要します。

そのため、この言語機能が SQL Anywhere version 12 で利用可能になったことをたいへんうれしく思います。

 

 

構文とセマンティクス

 

SQL Anywhere 12 におけるこの機能の文法は以下のとおりです:

 

  1. <table primary> ::= <table or query name> [ [ AS ] <correlation name> [ ( <derived column list> ) ] ]
  2.       | other forms of table references …
  3.       | ( <dml derived table> ) REFERENCING <result option>
  4. <dml derived table> ::= <delete statement>
  5.       | <insert statement>
  6.       | <merge statement>
  7.       | <update statement>
  8. <result option> ::= OLD [AS] <correlation name>
  9.     | FINAL [AS] <correlation name>
  10.     | OLD [AS] <correlation name> FINAL [AS] <correlation name>

 

この構文は、DB2 で提供されているものとは 2 つの点で大きく異なります。

まず第一に UPDATE または MERGE 文から新しい値と古い値の比較を計算するアプリケーションにおいて、構文を簡潔にしたいという思いがありました。

そして第二に、同じリクエストにおいてdml-derived-table を他のオブジェクトに簡単に joinできるようにしたいと考えたからです。

 

dml-derived-table の構文は以下のとおりです。

 

 

続きはこちら: SAP SQL Anywhere における SELECT 文内での UPDATE 文の使用

 

SAPのSAP SQL Anywhere製品ページはこちら