ESTÁ REDONDAMENTE ERRADO!
Vamos aplicar e ver o porque essa dica é furada!
1. Vamos criar a tabela usada:
Selecionar tudo
create table tab_enderecos
( cliente_id number(10)
, endereco_id number(10)
, endereco varchar2(100)
);
2. DE CARA, já vi que vai dar erro na trigger por 2 motivos:
(a). Erro de sintaxe na declaração da variável. Deveria ser:
(b). Não tem exception. Vai dar erro caso a tabela estiver vazia ou for o primeiro registro inserido do CLIENTE_ID..
3. Por isso, vamos inserir agora o cliente 1 (pra evitar o erro).
Selecionar tudo
SQL> insert into tab_enderecos values (1, 1, 'meu endereço');
1 row created.
SQL> COMMIT;
4. Agora, aplique a trigger - corrigindo o erro da declaração que eu citei no item 3.
5. OK! Pronto pra testar! A trigger promete que vai colocar o ENDERECO_ID automático!!! É o que veremos:
Selecionar tudo
SQL> insert into tab_enderecos values (1, null, 'meu endereço');
1 row created.
SQL> select * from tab_enderecos;
CLIENTE_ID ENDERECO_ID ENDERECO
---------- ----------- ------------------------
1 1 meu endereço
1 2 meu endereço
2 row selected.
Ué? funcionou? SIM, porque o primeiro foi comitado! Se você rodar outro insert sem ter comitado o anterior, já vai dar erro. Isso porque a
Autonomous Transaction funciona em uma outra sessão, ou seja, não enxerga o que você acabou de inserir. Por isso, essa dica está totalmente furada. Veja o que acontece se eu inserir uma linha sem comitar a anterior:
Selecionar tudo
SQL> insert into tab_enderecos values (1, null, 'meu endereço');
1 row created.
SQL> select * from tab_enderecos;
CLIENTE_ID ENDERECO_ID ENDERECO
---------- ----------- ------------------------
1 1 meu endereço
1 2 meu endereço
1 2 meu endereço
3 row selected.
DUPLICOU o ID 2 !!!!! ERRO!!!
Deve-se ter muito cuidado ao usar esse tipo de transação, pois você pode estar fazendo uma grande bobagem e detonando a informação da sua base. (como no exemplo citado na "dica" acima)