[Resolvido] Script Postgres para Oracle
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;Discussão (2)
Carregando comentários...