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.....
tratar insercao
-
- 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
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
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
-
- 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
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;
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;
- fsitja
- 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
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:
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
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:
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;
Se não encontrar nada ele vai disparar um exception NO_DATA_FOUND e ali você pode jogar o insert.
Falou
- fsitja
- 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
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:
Qualquer coisa dá um Google no MERGE.
Falou!
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>
Falou!
- fsitja
- 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
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:
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
-
- Informação
-
Quem está online
Usuários navegando neste fórum: Nenhum usuário registrado e 6 visitantes