|
分類:[.NET 全般]
ORACLEのPL/SQLについての質問です。
主に以下の2点で悩んでいます。
・SQLの共通部分をまとめられない(同じコードが散在してしまう)
・条件分岐を利用してまとめると、大層遅くなってしまう
たとえば「サブクエリが全く同じ2つのSQL文」「ORDER BY だけが変わるSQL文」「同じ内容を返す複数のカーソル」
…といったものです。
(共通部分をまとめたい例)
INSERT INTO baz SELECT f.f1, b.b1 FROM foo f (SELECT b1, b2 FROM bar) b; --サブクエリ部分は同じなので
INSERT INTO qux SELECT f.f2, b.b2 FROM foo f (SELECT b1, b2 FROM bar) b; --2回書きたくない
素人考えですが、テキスト置換やシンタックスシュガーに類する物のように思えるので、
何か手がありそうなのですが…。
(条件分岐で一本化した例)
--2回書くのは嫌だなあ…
IF a = 1 THEN
INSERT INTO fuga SELECT wan.kuma, hoge.piyo FROM wan, hoge ORDER BY hoge.piyo, wan.kuma;
ELSE
INSERT INTO fuga SELECT wan.kuma, hoge.piyo FROM wan, hoge ORDER BY wan.kuma, hoge.piyo;
END IF;
--1回だけど遅いなあ…
INSERT INTO fuga
SELECT wan.kuma, hoge.piyo
ORDER BY
CASE a WHEN 1 THEN hoge.piyo ELSE wan.kuma END,
CASE a WHEN 1 THEN wan.kuma ELSE hoge.piyo END;
CASE文を並べれば一本化出来るのですが、事前に確定するような条件であっても
一行毎に条件を計算してしまってパフォーマンスが悪い…なんて書き込みを見たりして頭を抱えています。
「絞り込み条件はともかく、過剰な条件分岐をSQLに持ち込むべきではない」「複数のSQLに分けるべき」とも。
通常のプログラム言語ならライブラリソースやら何やらを量読めば指針がつかめるのだと思いますが、
PL/SQLについて、中庸な、きれいな(個人差ありますが)、平均的な、よくまとまった、という指針を得る
良い手だてがイマイチ思い浮かばず、場違いかとは思いつつ質問させて頂きました。
上記の問題に対するアドバイスの他、情報源や書籍など何でも構いません。
的を射ない厚かましい質問で申し訳ありませんが、差し支えなければ、どうかご教示ください。
|