SymfowareでのSQL問い合わせに関する考慮事項等を自分用メモも兼ねて記載します。比較する場合は基本的にはOracleとの比較になります。
INSERT SELECT
挿入先のテーブルをSELECT句で指定できない(ビューを指定し、ビューから参照されている場合も同様)。
同一テーブル内でのコピーができないので、一旦一時表に入れるとか、JDBC接続等であれば、一旦取得してINSERTかけるしかない。
Oracle.sql
-- Oracleでは可能
INSERT INTO hoge_tbl
(SELECT hoge_seq.nextval, hoge_col FROM hoge_tbl);
UPDATE FROM
更新時に別テーブルの値を利用することができない。
SQLServer.sql
-- SQLServerでは可能
UPDATE hoge_tbl SET
hoge_tbl.hoge_col1 = fuga_tbl.fuga_col1
FROM fuga_tbl
WHERE hoge_tbl.key_col = fuga_tbl.key_col;
Oracle.sql
-- Oracleでは副問合せで可能
UPDATE hoge_tbl SET
(hoge_col1, hoge_col2) =
(SELECT fuga_col1, fuga_col2
FROM fuga_tbl
WHERE hoge_tbl.key_col = fuga_tbl.key_col);
リテラル指定
Symfowareでは日付型をリテラルで指定する際、型名の指定が必要。
Symfoware.sql
SELECT *
FROM hoge_tbl
WHERE date_col = DATE'2000-01-01'
AND timestamp_col = TIMESTAMP'2000-01-01 00:00:00';
システム表
カラム定義情報取得
SELECT rc.*
FROM RDBII_SYSTEM.RDBII_TABLE rt
LEFT OUTER JOIN RDBII_SYSTEM.RDBII_COLUMN rc
ON (rt.DB_CODE = rc.DB_CODE AND rt.SCHEMA_CODE = rc.SCHEMA_CODE AND rt.TABLE_CODE = rc.TABLE_CODE)
WHERE rt.TABLE_NAME = 'hoge_table'
インデックス情報取得
SELECT
TABLE_NAME
, INDEX_DSO_NAME
, rcu.ORDINAL_POSITION
, rc.COLUMN_NAME
FROM
RDBII_SYSTEM.RDBII_TABLE rt
INNER JOIN RDBII_SYSTEM.RDBII_INDEX ri
ON (
rt.DB_CODE = ri.DB_CODE
AND rt.SCHEMA_CODE = ri.SCHEMA_CODE
AND rt.TABLE_CODE = ri.TABLE_CODE
)
INNER JOIN RDBII_SYSTEM.RDBII_COLUMN_USAGE rcu
ON (
ri.DB_CODE = rcu.DB_CODE
AND ri.SCHEMA_CODE = rcu.OBJ_SCHEMA_CODE
AND ri.INDEX_DSO_CODE = rcu.OBJECT_CODE
)
INNER JOIN RDBII_SYSTEM.RDBII_COLUMN rc
ON (
ri.DB_CODE = rc.DB_CODE
AND ri.SCHEMA_CODE = rc.SCHEMA_CODE
AND ri.TABLE_CODE = rc.TABLE_CODE
AND rcu.COLUMN_CODE = rc.COLUMN_CODE
)
WHERE DB_NAME = 'TEST_DB' AND TABLE_NAME = 'TEST_TBL'
ORDER BY rt.TABLE_NAME, ri.INDEX_DSO_CODE, rcu.ORDINAL_POSITION;
表のDSI名取得
SELECT NAME
FROM RDBII_SYSTEM.RDBII_DSI_STATUS
WHERE TYPE = 'T' AND TABLE_NAME = 'TEST_TBL'
参考:A.3.26 DSI情報