これまでの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文に統合し,初回取り出し時に総ヒット件数を取得できます。
댓글 없음:
댓글 쓰기