2009년 10월 22일 목요일
oracle meta取得 SQL
2009년 10월 21일 수요일
# 재귀적 CME SQL 사용례 (in MSSQL)
2009년 10월 20일 화요일
재귀적 CTE
* 출처 : DB 가이드 넷(http://www.dbguide.net/sql2005_dev_guide/sql2005_dev_guide_03.jsp)
2009년 10월 13일 화요일
HiRDB sql
5.コメント /* コメント */はありますが、-- の1行コメントがありません。 6.LIKE検索の文字列連結 なんと、LIKE検索時に、LIKE '%' || '文字列' || '%'のような 文字列連結をするとエラーになるようです。 よって、CONDITIONが"CONTAINS","STARTS","ENDS","NOT_CONTAINS" のSQLは、HiRDBではエラーになると思われます・・・ 対策としては、下記の2パターンがあると思います。 (1)buyerItemCd_CONTAINS,buyerItemCd_STARTS,buyerItemCd_ENDS, buyerItemCd_NOT_CONTAINSを作成し、%をつけた文字列を設定。 SQLファイルとしては、現状の'%'|| || '%'を削除。 (2)複数入力ありのSQLと同様に、ジョンギルユーティリティで、 検索条件SQLは作成してしまう。 /*$conditionSql*/ いずれにせよLIKE検索は、%と_のESCAPE対応が必要なので、どちらかの 対応は必要になります。 どうせ複数入力ありの対応をやるなら(2)でも良いかなぁと思っています。 ユーザのロールや所属に合わせた範囲指定などだけをSQLファイルに 指定してもらうイメージです。 【現状のSQLファイル】 /*IF buyerItemCd != null && buyerItemCd_CONDITION == "CONTAINS" */AND BUYER_ITEM_CD LIKE '%' || /*buyerItemCd*/ || '%'/*END*/ /*IF buyerItemCd != null && buyerItemCd_CONDITION == "STARTS" */AND BUYER_ITEM_CD LIKE '%' || /*buyerItemCd*//*END*/ /*IF buyerItemCd != null && buyerItemCd_CONDITION == "ENDS" */AND BUYER_ITEM_CD LIKE /*buyerItemCd*/ || '%'/*END*/ /*IF buyerItemCd != null && buyerItemCd_CONDITION == "NOT_CONTAINS" */AND BUYER_ITEM_CD NOT LIKE '%' || /*buyerItemCd*/ || '%'/*END*/ ちなみに、ESCAPE処理を検証したところ、下記の感じでよさそうです。 LIKE '文字列' ESCAPE '|'とした場合の文字列の組み立て形。 (1)画面入力された文字の|を||に置換 (2)画面入力された文字の%を|%に置換 (3)画面入力された文字の_を|_に置換 (4)画面入力された文字の%を|%に置換 (5)画面入力された文字の_を|_に置換 (6)CONTAINS、STARTS、ENDS、NOT_CONTAINSの条件に合わせて、%を前後に追加 例:画面の検索条件 テスト|12345→ '%テスト||12345%'
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文に統合し,初回取り出し時に総ヒット件数を取得できます。
2009년 10월 1일 목요일
java-DB(HiRDB or Oracle) 型対応
http://www.hitachi.co.jp/Prod/comp/soft1/manual/common/hirdb.htm
表 2‑1 アプリ-DB型対応表
項番 |
Java |
COBOL(HiRDB接続) |
HiRDB |
Oracle |
1 |
Integer |
L1 基本項目名 |
INTEGER |
NUMBER |
2 |
Short |
L1 基本項目名 |
SMALLINT |
NUMBER |
3 |
BigDecimal |
L1 基本項目名 ここで、1<=p<=18, |
DECIMAL |
NUMBER |
4 |
Double |
L1 基本項目名 |
FLOAT |
NUMBER |
5 |
String |
L1 基本項目名 ここで、1<=n<=30000 |
MCHAR |
CHAR |
6 |
String |
L2 集団項目名. ここで、1<=n<=32000 |
MVARCHAR |
VARCHAR2 |
7 |
Date |
L1 基本項目名 |
DATE |
使用しない |
8 |
Time |
L1 基本項目名 PICTURE X(8). |
TIME |
使用しない |
9 |
Timestamp |
L1 基本項目名 PICTURE X(22). |
TIMESTAMP |
TIMESTAMP |
10 |
byte[] |
L2 集団項目名 単位省略時: |
BLOB BINARY |
BLOB |
11 |
String |
同上 |
BLOB BINARY |
BLOB |
12 |
String |
使用しない |
使用しない |
CLOB |
13 |
String |
HIRDBのMVARCHAR型に従う |
FREEWORD |
使用しない |
14 |
byte[] |
HIRDBのBLOB型に従う |
SGMLTEXT |
使用しない |
15 |
String |
同上 |
SGMLTEXT |
使用しない |