tratar insercao

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
lopesdc
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 6
Registrado em: Qua, 17 Jun 2009 3:21 pm
Localização: Praia

ola pessoal eu gostaria que alguém me ajuda-se a encontrar uma forma de evitar insercao de nome iguais duas vezes, sem utilizacao de unique kei, mas pode ser atrves de uma funcao

obrigado.....
SergioLBJr
Rank: Oracle Guru
Rank: Oracle Guru
Mensagens: 448
Registrado em: Ter, 16 Jun 2009 3:07 pm
Localização: Parobé - RS
Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS

[]s

Bom dia

Minha sugestão é que crie um cursor na sua função para varrer a tabela.
Então dentro de um loop você abre o cursor e faz o fetch dele dentro de um record e compara o nome que esta tentando inserir com o campo de nome do record sele ele não axar insere se não axar retorna uma exception.

Espero ter ajudado, qualquer duvida, de como fazer a função poste aqui no forum :wink:
SergioLBJr
Rank: Oracle Guru
Rank: Oracle Guru
Mensagens: 448
Registrado em: Ter, 16 Jun 2009 3:07 pm
Localização: Parobé - RS
Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS

[]s

Podes fazer um procedimento para inserir, ou uma função que retorne true ou false conforme o resultado do teste do cursor.
Se optar pela função então antes de inserir chame ela, abaixo dois exemplos um caso o teste retorne true para poder inserir e outro caso retorne false

if testa_nome then
insert into tabela (.....)
values(....)
end if;

ou

if not testa_nome then
insert into tabela (....)
values (...)
end if;
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Você pode colocar essa lógica em programa, porém não há garantias de consistência como na unique key. E você pode ter problemas com concorrência, onde dois usuários tentem inserir o mesmo nome ao mesmo tempo e vão conseguir, deixando seu banco de dados inconsistente.

De qualquer forma, varrer a tabela num loop como o Sergio falou vai matar seu desempenho se a tabela for grande. Faça um select estilo:

Selecionar tudo

declare
  v_num number;
begin
  select 1
    into v_num
    from dual
   where exists (select 1 from func f where upper(f.nome_func) = upper('JOÃO SILVA'));
exception
  when no_data_found then
    dbms_output.put_line('INSERINDO');
    -- coloque seu insert aqui
end;
passando o nome como variável ali no lugar do João.
Se não encontrar nada ele vai disparar um exception NO_DATA_FOUND e ali você pode jogar o insert.

Falou
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Ummm caiu a ficha aqui, tem um jeito beeem mais elegante de fazer isso, desculpa por não ter me tocado antes:

Selecionar tudo

SQL> set serveroutput on
SQL> SELECT * FROM func;

  COD_FUNC NOME_  COD_DEPTO
---------- ----- ----------
        10 JOÃO           1
        20 PEDRO          1
        30 ANA            2

SQL> MERGE INTO func f
  2     USING (SELECT 1 cod_func, 'MARIA' nome_func from dual) t
  3     ON (f.cod_func = t.cod_func)
  4     WHEN NOT MATCHED THEN INSERT (f.cod_func, f.nome_func)
  5       VALUES (t.cod_func, t.nome_func)
  6       WHERE (t.cod_func = 1);

1 linha intercalada.

SQL> SELECT * FROM func;

  COD_FUNC NOME_  COD_DEPTO
---------- ----- ----------
        10 JOÃO           1
        20 PEDRO          1
        30 ANA            2
         1 MARIA

SQL> MERGE INTO func f
  2     USING (SELECT 1 cod_func, 'MARIA' nome_func from dual) t
  3     ON (f.cod_func = t.cod_func)
  4     WHEN NOT MATCHED THEN INSERT (f.cod_func, f.nome_func)
  5       VALUES (t.cod_func, t.nome_func)
  6       WHERE (t.cod_func = 1);

0 linhas intercaladas.

SQL> 
Qualquer coisa dá um Google no MERGE.

Falou!
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Com comentários para facilitar:

Selecionar tudo

MERGE INTO func f -- tabela onde será inserido
   USING (SELECT 1 cod_func, 'MARIA' nome_func from dual) t -- colocar select de sua tabela origem
   ON (f.cod_func = t.cod_func) -- sua chave primária
   WHEN NOT MATCHED THEN INSERT (f.cod_func, f.nome_func) -- suas colunas aqui
     VALUES (t.cod_func, t.nome_func) -- repetir colunas
     WHERE (t.cod_func = 1) -- substituir pelo parâmetro
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 6 visitantes