Como criar esta procedure

Tenho estas duas tabelas no banco

cadcha (Cadastro de chamadas)

cadram (Cadastro de ramal)

Todas as ligações realizadas em uma determinada empresa, serão salvas neste tabela cadcha. O campo ramal destino, é o ramal que atendeu ou realizou esta respectiva ligação. Também tenho uma segunda tabela, chamada cadram, onde são realizados os cadastro de ramal manualmente, e os relatórios do sistema são gerados a partir desta tabela cadram. Gostaria de implementar uma procedure que quando acionada, cadastrasse os ramais encontrados no campo ramalorigem da tabela cadcha na tabela cadram (Obviamente os ramais que ainda não tem cadastro). Exemplo:
Temos ali na tabela cadcha o ramalorigem 4554, porém na tabela cadram não temos este ramal ainda. Gostaria que a procedure realizasse isso.

O que consegui até o momento:

SELECT que retorna todos os ramais das ligações que ainda não foram cadastrados:

SELECT DISTINCT (RAMALDESTINO)
FROM CADCHA
WHERE RAMALDESTINO
NOT IN
(SELECT RAMCOD FROM CADRAM)

Escopo da procedure, que é a parte onde não consegui ir em frente:
Obs: Nas procedures do firebird é obrigatório passar um valor por parâmetro e retornar alguma coisa?

CREATE PROCEDURE SP_CADRAM_AUTOMATICO
(
teste VARCHAR(1)
)
RETURNS
(
EXCEPTION “Procedure Acionada”
)
AS
BEGIN
FOR
SELECT DISTINCT (RAMALDESTINO)
FROM CADCHA
WHERE RAMALDESTINO
NOT IN
(SELECT RAMCOD FROM CADRAM)
DO
BEGIN
INSERT INTO CADCHA (RAMCOD, RAMDES) VALUES (RAMALDESTINO, ‘RAMAL’);
END
END

Reforçando: preciso que a procedure cadastre os ramais na tabela cadram automaticamente pra mim, utilizando como base a tabela de ligações (cadcha) no campo ramaldestino.

=================

  

 

Faça um script para polular atualmente a cadcha, e depois seria melhor uma ´TRIGGER AFTER INSERT´ vinculada a tabela cadcha.
– David
17/12/15 às 16:01

  

 

O problema da trigger é que deixaria o sistema bem lento, pois alguns clientes realizam diversas ligações por minuto que são tarifadas em tempo real na tabela cadcha. Por isso optei pela procedure, porém percebi que a sintaxe dela é diferente da trigger, o que não acontece em alguns SBDBs como o SQL SERVER.
– antunesleo_
17/12/15 às 16:10

  

 

Entendi, mas ai não seria “automático”, como você pensa em executar esse procedimento?
– David
17/12/15 às 16:16

  

 

O automático que digo seria na parte de não ter que cadastrar os ramais manualmente um a um. A ideia é ter um botão “Atualizar ramais” que irá chamar está procedure.
– antunesleo_
17/12/15 às 16:18

=================

1 Resposta
1

=================

a procedure para fazer o que deseja ficaria assim:

create procedure SP_CADRAM_AUTOMATICO
as
declare variable VRAMAL_DESTINO integer;
begin
for
select distinct
(RAMALDESTINO)
from
CADCHA
where
RAMALDESTINO not in (select
RAMCOD
from
CADRAM)
into
VRAMAL_DESTINO
do
begin
insert into CADRAM (
RAMCOD,
RAMDES)
values (
VRAMAL_DESTINO,
‘RAMAL’);
end
end