Ir para conteúdo

POWERED BY:

Arquivado

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

Samuel Mattos

[Resolvido] Script Postgres para Oracle

Recommended Posts

Boa tarde,

Tenho a seguinte função em um banco de dados postgres funcionando perfeitamente, mas surgiu a necessidade de migrar o banco de dados de postgres para oracle e estou com dificuldades para criar a função corretamente no banco Oracle.

Abaixo a função em postgres.

CREATE FUNCTION sp_acumular_atendimentos(p_dt_max timestamp with time zone) RETURNS void
   AS $$
BEGIN
   -- salva atendimentos
   INSERT INTO historico_atendimentos
   SELECT a.id_atend, a.id_uni, a.id_usu, a.id_serv, a.id_pri, a.id_stat, a.num_senha, a.nm_cli, a.num_guiche, a.dt_cheg, a.dt_cha, a.dt_ini, a.dt_fim, a.ident_cli
   FROM atendimentos a
   WHERE dt_cheg <= p_dt_max
   FOR UPDATE;

   -- salva atendimentos codificados
   INSERT INTO historico_atend_codif
   SELECT ac.id_atend, ac.id_serv, ac.valor_peso
   FROM atend_codif ac
   WHERE id_atend IN (
       SELECT a.id_atend
       FROM atendimentos a
       WHERE dt_cheg <= p_dt_max
   )
   FOR UPDATE;

   -- limpa atendimentos codificados
   DELETE FROM atend_codif ac
   WHERE ac.id_atend IN (
       SELECT a.id_atend
       FROM atendimentos a
       WHERE dt_cheg <= p_dt_max
   );

   -- limpa atendimentos
   DELETE FROM atendimentos
   WHERE dt_cheg <= p_dt_max;
END;
$$
   LANGUAGE plpgsql;

 

E a função em Oracle que estou tentando criar.

 

create or replace
FUNCTION sp_acumular_atendimentos(p_dt_max IN timestamp with time zone)
RETURN VARCHAR2  IS
    CURSOR referrer_keys IS
   SELECT a.id_atend, a.id_uni, a.id_usu, a.id_serv, a.id_pri, a.id_stat, a.num_senha, a.nm_cli, a.num_guiche, a.dt_cheg, a.dt_cha, a.dt_ini, a.dt_fim, a.ident_cli
   FROM atendimentos a
   WHERE a.dt_cheg <= p_dt_max;

   CURSOR referrer_keys2 IS
   SELECT ac.id_atend, ac.id_serv, ac.valor_peso
   FROM atend_codif ac
   WHERE id_atend IN (
       SELECT a.id_atend
       FROM atendimentos a
       WHERE dt_cheg <= p_dt_max
   );    
BEGIN
   -- salva atendimentos
   FOR referrer_key IN referrer_keys LOOP
         INSERT INTO historico_atendimentos a (a.id_atend, a.id_uni, a.id_usu, a.id_serv, a.id_pri, a.id_stat, a.num_senha, a.nm_cli, a.num_guiche, a.dt_cheg, a.dt_cha, a.dt_ini, a.dt_fim, a.ident_cli) 
         VALUES(referrer_keys.id_atend, referrer_keys.id_uni, referrer_keys.id_usu, referrer_keys.id_serv, referrer_keys.id_pri, referrer_keys.id_stat, referrer_keys.num_senha, referrer_keys.nm_cli, referrer_keys.num_guiche, referrer_keys.dt_cheg, referrer_keys.dt_cha, referrer_keys.dt_ini, referrer_keys.dt_fim, referrer_keys.ident_cli);
   END LOOP;

   -- salva atendimentos codificados
   FOR referrer_keys2 IN referrer_keys2 LOOP
         INSERT INTO historico_atend_codif ac (ac.id_atend, ac.id_serv, ac.valor_peso)
         VALUES(referrer_keys2.id_atend, referrer_keys2.id_serv, referrer_keys2.valor_peso);
   END LOOP;

   -- limpa atendimentos codificados
   DELETE FROM atend_codif ac
   WHERE ac.id_atend IN (
       SELECT a.id_atend
       FROM atendimentos a
       WHERE dt_cheg <= p_dt_max
   );

   -- limpa atendimentos
   DELETE FROM atendimentos
   WHERE dt_cheg <= p_dt_max;
END;

 

O meu problema é que o SQL Developer sempre acusa erro no laços de repetição, estou utilizando o banco de dados 11g da Oracle.

Se alguem poder me ajudar a resolver este problema fico agradecido.

 

Raça dei uma arrumada no código aqui e aparentemente vai funcionar de acordo com o Compilar para Depurar do Oracle SQL, mas se alguem tiver alguma sugestão dexo o tópico em aberto ainda.

 

create or replace
FUNCTION sp_acumular_atendimentos(p_dt_max IN timestamp with time zone)
RETURN VARCHAR2 IS
    CURSOR referrer_keys IS
   SELECT a.id_atend, a.id_uni, a.id_usu, a.id_serv, a.id_pri, a.id_stat, a.num_senha, a.nm_cli, a.num_guiche, a.dt_cheg, a.dt_cha, a.dt_ini, a.dt_fim, a.ident_cli
   FROM atendimentos a
   WHERE a.dt_cheg <= p_dt_max;

   CURSOR referrer_keys2 IS
   SELECT ac.id_atend, ac.id_serv, ac.valor_peso
   FROM atend_codif ac
   WHERE id_atend IN (
       SELECT a.id_atend
       FROM atendimentos a
       WHERE dt_cheg <= p_dt_max
   );    
BEGIN

OPEN referrer_keys;
OPEN referrer_keys2;
   -- salva atendimentos
   FOR referrer_key IN referrer_keys LOOP
         INSERT INTO historico_atendimentos a (a.id_atend, a.id_uni, a.id_usu, a.id_serv, a.id_pri, a.id_stat, a.num_senha, a.nm_cli, a.num_guiche, a.dt_cheg, a.dt_cha, a.dt_ini, a.dt_fim, a.ident_cli) 
         VALUES(referrer_key.id_atend, referrer_key.id_uni, referrer_key.id_usu, referrer_key.id_serv, referrer_key.id_pri, referrer_key.id_stat, referrer_key.num_senha, referrer_key.nm_cli, referrer_key.num_guiche, referrer_key.dt_cheg, referrer_key.dt_cha, referrer_key.dt_ini, referrer_key.dt_fim, referrer_key.ident_cli);
   END LOOP;

   -- salva atendimentos codificados
   FOR referrer_key2 IN referrer_keys2 LOOP
         INSERT INTO historico_atend_codif ac (ac.id_atend, ac.id_serv, ac.valor_peso)
         VALUES(referrer_key2.id_atend, referrer_key2.id_serv, referrer_key2.valor_peso);
   END LOOP;

   -- limpa atendimentos codificados
   DELETE FROM atend_codif ac
   WHERE ac.id_atend IN (
       SELECT a.id_atend
       FROM atendimentos a
       WHERE dt_cheg <= p_dt_max
   );

   -- limpa atendimentos
   DELETE FROM atendimentos
   WHERE dt_cheg <= p_dt_max;
END;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Usando a estrutura FOR para CURSOR não precisa fazer o OPEN.

 

OPEN/FETCH/CLOSE tudo imbutido.

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.