2009년 10월 6일 화요일

HirDB vs Oracle sql

これまでのHiRDB対応でOracleのSQLと異なっているために、
つまづいた点を下記に纏めました。
少しずつノウハウの蓄積が必要な感じです。

1.シーケンス値の設定
[Oracle]
 シーケンス名.NEXTVAL
 forcast_id_seq.NEXTVAL
[HiRDB]
 NEXT VALUE FOR シーケンス名
 NEXT VALUE FOR forcast_id_seq

※HiRDBでは、単純なSELECT文ではシーケンス値の取得はできない。
 INSERT INTO SELECTやUPDATEの中でのみ利用可能。

2.SELECT文でのNULL取得
[Oracle]
 SELECT NULL AS TEST1 FROM TEST
[HiRDB]
 SELECT CAST(NULL AS VARCHAR) AS TEST1 FROM TEST

※HiRDBでは、OracleのようにはNULLを取得できない。
 型を指定してCASTが必要。

3.SQL ExecuterにおけるSQL実行
[HiRDB]
 改行コードが取り除かれて次行のSQLと連結されるため、先頭行に
 FROMを記述した場合に、SQLの構文エラーとなる。

 SELECT *
 FROM TEST;
 を実行とすると、SELECT *FROM TESTとなり、構文エラー。

4.総件数の取得について
 総ヒット件数返却機能というのがあるそうです。
 http://www.hitachi.co.jp/Prod/comp/soft1/manual/pc/d635640/W3560167.HTM
通常,総ヒット件数とヒットした行の値を求める場合,
 二つのSQL文を実行しますが, 総ヒット件数返却機能を
 使用すると,総ヒット件数を求めるSQLと,ヒットした行の
 値を求めるSQLとを,一つのSQLに統合できます。
 これによって,二つのSQL文を実行するための検索時間が,
 一つのSQL文を実行する検索時間とほぼ等しくなります。

 必ずORDER BY等はつくので、一覧取得のSQLにCOUNT(*) OVER()を
 加えて、1回で取得した方がよさそうです。

 ※ちなみに、Oracleも同じSQLが実行できます
4.17.2 使用例

在庫表(ZAIKO)から単価(TANKA)が5000円以上の商品の総数と,その商品名(SNAME)を求め,数量(ZSURYO)でソートする場合の例を次に示します。

  • 総ヒット件数返却機能を使用しない場合
    SELECT COUNT(*) FROM ZAIKO WHERE TANKA>=5000
    SELECT SNAME    FROM ZAIKO WHERE TANKA>=5000 ORDER BY ZSURYO
    [説明]
    総ヒット件数返却機能を使用しない場合は,二つのSQL文が必要となります。
  • 総ヒット件数返却機能を使用する場合
    SELECT COUNT(*) OVER(), SNAME 
                    FROM ZAIKO WHERE TANKA>=5000 ORDER BY ZSURYO
    [説明]
    二つのSQL文の下線部が同じなので,総ヒット件数返却機能を使用することで一つのSQL文に統合し,初回取り出し時に総ヒット件数を取得できます。

댓글 없음:

댓글 쓰기