Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

denisciola

Create Procedure

Recommended Posts

Bom dia Galera,




Preciso inserir os dados da tabela stg_loc_cliente_fe na tabela STG_DIM_FAIXA_ETARIA, porém antes que o INSERT ocorra preciso verificar se o cd_cliente já exista, caso o cd_cliente existe, não poderá ocorrer o INSERT, pois o sequence não pode ser alterar.


Podem me ajudar?



CREATE OR REPLACE PROCEDURE carga_stg_dim_faixa_etaria as

CURSOR stg_loc_cliente_fe is
SELECT
cd_cliente,
dt_nascimento
FROM stg_loc_cliente_fe;


v_contador number := 00;
v_error varchar2(255);
v_surrogate_key_fe number;


BEGIN
DELETE STG_DIM_FAIXA_ETARIA;
FOR i IN stg_loc_cliente_fe
LOOP
v_contador := v_contador + 1;


SELECT SEQ_DIM_FAIXA_ETARIA.NEXTVAL
INTO v_surrogate_key_fe
FROM DUAL;


INSERT INTO STG_DIM_FAIXA_ETARIA
(
sk_faixa_etaria,
cd_cliente,
tp_faixa_etaria
)
VALUES
(
v_surrogate_key_fe,
i.cd_cliente,
i.dt_nascimento


);
END LOOP;
dbms_output.put_line('Total de Linhas processadas... : '||to_char(v_contador));


COMMIT;


EXCEPTION
WHEN OTHERS THEN
v_error := substr(sqlerrm,1,255);
raise_application_error(-20006, 'Erro crítico...: ' || v_error );
END;



Obrigado a todos...


Denis.


Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde Denis,

 

Tem várias maneiras, uma delas e colocar o seguinte select no seu cursor:

SELECT a.cd_cliente, a.dt_nascimento
FROM stg_loc_cliente_fe a, STG_DIM_FAIXA_ETARIA b
where b.cd_cliente is null
and a.cd_cliente = b.cd_Cliente(+);
Só retornaria quando não existe na STG_DIM_FAIXA_ETARIA.
Alem disso poderia usar o EXISTS, ou criar um índice único no cd_cliente da STG_DIM_FAIXA_ETARIA e tratar no
exception do insert.

Depende um pouco do tamanho da sua tabela.

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Boa tarde Denis,

 

Tem várias maneiras, uma delas e colocar o seguinte select no seu cursor:

SELECT a.cd_cliente, a.dt_nascimento
FROM stg_loc_cliente_fe a, STG_DIM_FAIXA_ETARIA b
where b.cd_cliente is null
and a.cd_cliente = b.cd_Cliente(+);
Só retornaria quando não existe na STG_DIM_FAIXA_ETARIA.
Alem disso poderia usar o EXISTS, ou criar um índice único no cd_cliente da STG_DIM_FAIXA_ETARIA e tratar no
exception do insert.

Depende um pouco do tamanho da sua tabela.

 

 

 

Boa tarde spernega,
Implementei sua alteração e mesmo assim a Sequencia continua incrementado a partir do ponto em que estava, eu preciso que em todo vez que eu rodo a procedure o sequence seja zerado e se inicie novamente.
Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites
Denis,


Já que precisa começar do zero e você apaga a STG_DIM_FAIXA_ETARIA, melhor usar o contador ao invés da sequence.


Elimina a busca da sequence

SELECT SEQ_DIM_FAIXA_ETARIA.NEXTVAL

INTO v_surrogate_key_fe

FROM DUAL;


E substitui a v_surrogate_key_fe por v_contador no INSERT


resolveria?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.