ぽざうねっと

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  390  : 記事  0  : コメント  953  : トラックバック  67

ニュース

さて、今年の秋は何を漬けようか

書庫

日記カテゴリ

Accessory

Community

Private

INSERT INTO TBL1 (
     COL11
    ,COL12
)
SELECT
     COL21
    ,CASE WHEN TRIM(COL22) IS NULL THEN DEFAULT ELSE COL22 END
FROM
    TBL2
Oracle にて、こういうことをしたいが無理っぽい。(意味は通じるよね?)
仕方ないのでカーソルまわして、ゴリゴリ文字列連結して一件ずつ execute immediate とかやってる。
INSERT 時に対象の列だけ省いて INSERT し、あとで UPDATE で CASE すればいけるか??と思ったが、10数個の列のうち主キー指定されているのが10個ほどで、空ならデフォルトにしたい行も主キーに含まれている。
どんなテーブル設計だ!と突っ込みたいが、上から降ってきたものだから仕方がない。
SYS.COL ビューからデフォルト値を取ってくるか!と思ったが、LONG 型を CHAR 型に変換できなくて断念。
どうにか方法はないものか
投稿日時 : 2008年1月31日 16:36

コメント

# re: 空だったらデフォルトを挿入 2008/01/31 17:28 はつね
COL22にはDEFAULT定義があるんですよね?
INSERTしたときにCOL22していないからDEFAULT定義の値が設定されているように思えるのですが、だめでしたっけ?

空ならばって、空白だけならと考えるならば、BEFORE INSERTトリガーでCOL22のINSERT値が空白だけならNULL入れる→DEFAULT定義の値になるってのじゃだめ?


# re: 空だったらデフォルトを挿入 2008/01/31 18:07 THREE-ONE
> COL22にはDEFAULT定義があるんですよね?
COL22 じゃなくて、COL12 には DEFAULT 定義があります。
COL22 が空だった場合、COL12 に COL12 の DEFAULT を設定したいのです。
んで COL22 が空じゃない場合は COL12 に COL22 の値をそのまま設定します。

> BEFORE INSERTトリガーでCOL22のINSERT値が空白だけならNULL入れる→DEFAULT定義の値になるってのじゃだめ?
NULL を明示的に入れたらはじかれません?
INSERT の対象列からはじかれた場合のみ DEFAULT が設定されると思っていましたが。
どっちにしろ、トリガーは厳しいみたいなんですけどorz

# re: 空だったらデフォルトを挿入 2008/01/31 18:08 THREE-ONE
> NULL を明示的に入れたらはじかれません?
言葉足りてませんでしたね、COL12 は NOT NULL が設定されています。

# re: 空だったらデフォルトを挿入 2008/01/31 19:18 kox
DEFAULTをマジックナンバーで指定・・・
#ごめんなさい。ごめんなさい。

検証していないけど、試していないから推測だけなんで申し訳ないですが、
ALL_TAB_COLUMNSテーブルにテーブルのカラム情報があって、
DATA_DEFAULTにDEFAULTの値が入っているから、
それをゴニョゴニョすれば・・・
むりかなぁ。


# re: 空だったらデフォルトを挿入 2008/01/31 19:33 やじゅ
CASE WHEN TRIM(COL22) IS NULL THEN
(select DATA_DEFAULT
from user_tab_columns
where user_tab_columns.TABLE_NAME = 'TBL2'
' AND COLUMN_NAME = 'COL21'
)
ELSE COL22 END
とか


# re: 空だったらデフォルトを挿入 2008/01/31 19:49 THREE-ONE
>koxさん
>やじゅさん
残念ながら、列のデフォルト値のデータはすべて LONG 型で格納されているみたいなんです。
COL も ALL_TAB_COLUMNS も USER_TAB_COLUMNS も、ぜーんぶ。
なので
> SYS.COL ビューからデフォルト値を取ってくるか!と思ったが、LONG 型を CHAR 型に変換できなくて断念
こうなっちゃうんですよね。

# re: 空だったらデフォルトを挿入 2008/01/31 22:45 Streetw☆
DEFAULTの定義はやめちゃダメですか?
トリガーでデフォルトを設定するようにするとできそうですけど。
はつねさんがすでに仰ってるから違うのかな。。

create table TESTTABLE20080131
(PKFIELD date primary key, DATAFIELD char(10))
/
create or replace trigger TESTTRIGGER20080131
before insert on TESTTABLE20080131
for each row
when (new.PKFIELD is null)
begin
:new.PKFIELD := sysdate;
end;
/
insert into TESTTABLE20080131 values (null, 'test!')
/


# re: 空だったらデフォルトを挿入 2008/02/01 1:02 THREE-ONE
なるほど、before insert でこういうことができるのですね。
ただ「トリガーはよっぽどのことがない限りつかっちゃダメ」ってルールなので、説得できるかどうかが怪しいところですね。
案として提案してみます。

みなさま、ありがとうございます。

Post Feedback

タイトル
名前
Url:
コメント: