備忘録

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

仮想列にINSERT時に値設定

おら! オラ! Oracle どっぷり検証生活のOracle 11g検証 隠れた新機能検証 その4から SQL を借用し仮想列を持つテーブルを作って insert してみる。

SQL> insert into VTP_ADDRESS values('1','1',null);
insert into VTP_ADDRESS values('1','1',null)
*
行1でエラーが発生しました。:
ORA-54013: 仮想列ではINSERT操作は許可されていません



だめですね。無視してくれるとうれしかった。
PL/SQL の ROWTYPE で定義されたレコードを bulk insert したかったけどできない。
実体を作ってINSERTトリガーで値を入れた方が使い勝手がいい。

SQL> ed
1 declare
2 TYPE TYPE_ADDRESS IS RECORD (
3 KEN_NAME VTP_ADDRESS.KEN_NAME%TYPE
4 ,KEN_CODE VTP_ADDRESS.KEN_CODE%TYPE
5 );
6 TYPE tArray IS TABLE OF TYPE_ADDRESS INDEX BY PLS_INTEGER;
7 list tArray;
8 begin
9 FOR i IN 1..10 LOOP
10 list(i).KEN_NAME := '北海道';
11 list(i).KEN_CODE := '01';
12 END LOOP;
13 forall i in 1 .. list.count
14 insert into VTP_ADDRESS values list(i);
15* end;
SQL> /
insert into VTP_ADDRESS values list(i);
*
行14でエラーが発生しました。:
ORA-06550: 行14、列14:
PL/SQL: ORA-00947: 値の個数が不足しています。
ORA-06550: 行14、列2:
PL/SQL: SQL Statement ignored


1 declare
2 TYPE TYPE_ADDRESS IS RECORD (
3 KEN_NAME VTP_ADDRESS.KEN_NAME%TYPE
4 ,KEN_CODE VTP_ADDRESS.KEN_CODE%TYPE
5 ,AREA_CODE VTP_ADDRESS.AREA_CODE%TYPE
6 );
7 TYPE tArray IS TABLE OF TYPE_ADDRESS INDEX BY PLS_INTEGER;
8 list tArray;
9 begin
10 FOR i IN 1..10 LOOP
11 list(i).KEN_NAME := '北海道';
12 list(i).KEN_CODE := '01';
13 END LOOP;
14 forall i in 1 .. list.count
15 insert into VTP_ADDRESS values list(i);
16* end;
17 /
declare
*
行1でエラーが発生しました。:
ORA-54013: 仮想列ではINSERT操作は許可されていません
ORA-06512: 行14



20万件入れるときの性能は仮想列で実装した時には 28.28秒、トリガーの場合は 30.75秒 で誤差の範囲?なのでトリガーがいいか。参考までに、INSERTトリガーをはずしたら 20.76秒だった。
INSERTする部分を修正できるのなら、トリガーも無しでやった方が性能的にはより良い。

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。