.comment-link {margin-left:.6em;}

Wednesday, January 07, 2009

INSERT ALL

Dúvida:

Marcio,

Segue abaixo um exemplo.
Eu leio os dados da tabela t1 e vou inserir em t2 e em t3.
Na tabela t2 vai inserir todos os dados, na tabela t3 só pode
inserir se a coluna c2 da tabela T1 estiver preenchida.

Grato pela atenção.

create table t1 (CL1 NUMBER(3), CL2 NUMBER(3), DATA_CARGA DATE );
create table t2 (CL1 NUMBER(3) PRIMARY KEY, CL2 NUMBER(3), DATA_INSERT DATE, USUARIO VARCHAR2(30) );
create table t3 (CL1 NUMBER(3) PRIMARY KEY, CL2 NUMBER(3) NOT NULL , DATA_INSERT DATE, USUARIO VARCHAR2(30) );

INSERT INTO T1(CL1, CL2) VALUES (1,10);
INSERT INTO T1(CL1, CL2) VALUES (2,20);
INSERT INTO T1(CL1) VALUES (3);
INSERT INTO T1(CL1) VALUES (4);
INSERT INTO T1(CL1) VALUES (5);


Quando o colega me enviou essa dúvida pela primeira vez, ele gostaria que eu o ajudasse a depurar um problema em um código procedural onde ele abria um cursor para ler a tabela T1 e inserir nas tabelas T2 e T3. Muitas vezes esquecemos dos recursos que o Oracle oferece e o código procedural é o primeiro que aparece para solucionarmos o problema, mas vale a pena dar uma paradinha para verificar se com SQL puro não se consegue o mesmo resultado só que com a performance bem melhor. No problema acima, o colega poderia esquecer o código procedural (cursor) e usar o INSERT ALL.

ops$marcio:DB11G> select * from t1;

CL1 CL2 DATA_CARGA
------------- ------------- -------------------
1 10
2 20
3
4
5

5 rows selected.

ops$marcio:DB11G> select * from t2;

no rows selected

ops$marcio:DB11G> select * from t3;

no rows selected

ops$marcio:DB11G>
ops$marcio:DB11G> insert all
2 when ( cl2 is not null ) then
3 into t3( cl1, cl2, data_insert, usuario )
4 values ( cl1, cl2, data_carga, user )
5 when ( 1=1 ) then
6 into t2( cl1, cl2, data_insert, usuario )
7 values ( cl1, cl2, data_carga, user )
8 select *
9 from t1
10 /

7 rows created.

ops$marcio:DB11G>
ops$marcio:DB11G> select * from t1;

CL1 CL2 DATA_CARGA
------------- ------------- -------------------
1 10
2 20
3
4
5

5 rows selected.

ops$marcio:DB11G> select * from t2;

CL1 CL2 DATA_INSERT USUARIO
------------- ------------- ------------------- ------------------------------
1 10 OPS$MARCIO
2 20 OPS$MARCIO
3 OPS$MARCIO
4 OPS$MARCIO
5 OPS$MARCIO

5 rows selected.

ops$marcio:DB11G> select * from t3;

CL1 CL2 DATA_INSERT USUARIO
------------- ------------- ------------------- ------------------------------
1 10 OPS$MARCIO
2 20 OPS$MARCIO

2 rows selected.

Dessa forma, foi possível atender os requisitos e completar a tarefa com uma única instrução SQL.

Labels:


This page is powered by Blogger. Isn't yours?