Olá amigos, estou migrando um sistema feito em firebird, para Postgre. Mas
como estou no início, estou tendo dificuldades. Tenho a seguinte Store
Procedure, feita em Firebird, algum amigo poderia converter ela pra PG,
estou tentando, mas to apanhando demais...
Desde já agradeço a todos.
SET TERM ^ ;
CREATE PROCEDURE PRC_SEQUENCIADORA (
tabela char(50),
campo char(40),
pendencia integer,
valoratual char(10))
returns (
id_retorno double precision)
as
declare variable id_sequencia integer;
BEGIN
/* Inclui uma Nova Pendência na Tabela de Pendências caso seja Passado no
parâmetro PENDENCIA o valor 11
Lembrando que deverá ser informado o valor que deverá ser guardado no
parâmetro
VALORATUAL */
/* O Valor do parâmetro Pendência e = . Indicando, que o usuário cancelou a
inclusão ou excluio o registro conforme veremos mais abaixo.
Sendo assim o sistema armazenara o valor a ser recuperado posteriormente,
e
finaliza a rotina */
ID_SEQUENCIA = 0;
if (Pendencia = 1) then
begin
INSERT INTO SYS_SEQUENCIADOR_PENDENCIAS
VALUES(UPPER(:TABELA), UPPER(:CAMPO), :VALORATUAL);
SUSPEND;
exit;
end
/* E verificado a existência de pendências no contador, caso encontre
continua */
if (exists( SELECT PENDENCIA_VALOR FROM SYS_SEQUENCIADOR_PENDENCIAS
WHERE SEQUENCIA_TABELA = :TABELA
AND SEQUENCIA_CAMPO = :CAMPO)) then
begin
/* Aqui e recuperado a seqüência perdida, armazenada no banco de dados */
FOR SELECT PENDENCIA_VALOR
FROM SYS_SEQUENCIADOR_PENDENCIAS
WHERE SEQUENCIA_TABELA = :TABELA
AND SEQUENCIA_CAMPO = :CAMPO
ORDER BY PENDENCIA_VALOR DESC /* Pegaremos do Maior para o Menor */
INTO :ID_SEQUENCIA DO
BEGIN
ID_RETORNO = :ID_SEQUENCIA;
END
end
else
/* Caso não exista pendências, a variável ID_SEQUENCIA e setada para 0*/
ID_SEQUENCIA = 0;
/* Caso a variável ID_SEQUENCIA esteja maior que 0 continua. */
if (ID_SEQUENCIA > 0) then
begin
/* Se chegamos ate aqui, e porque existe uma pendência. Então recuperamos
ela, e
deletamos-a do banco de dados para que nem um outro usuário na rede utilize
enquanto trabalhamos com ela. */
ID_RETORNO = :ID_SEQUENCIA;
DELETE FROM SYS_SEQUENCIADOR_PENDENCIAS
WHERE SEQUENCIA_TABELA = :TABELA
AND SEQUENCIA_CAMPO = :CAMPO
AND PENDENCIA_VALOR = :ID_SEQUENCIA;
SUSPEND;
exit;
end
else
begin
/* Caso a variável ID_SEQUENCIA esteja igual a 0, isso indica que não houve
pendências.
Então executa conforme abaixo*/
/* Primeiramente verifica se a tabela SYS_SEQUENCIADOR tem um valor
referenciado armazenado, para ser incrementado */
if (not(exists(SELECT SEQUENCIA_VALOR
FROM SYS_SEQUENCIADOR
WHERE SEQUENCIA_TABELA = :TABELA
AND SEQUENCIA_CAMPO = :CAMPO))) then
begin
/* Caso não exista cria um novo, e retorna com o Valor 1, que no caso seria
a seqüência inicial que o usuário teria.*/
INSERT INTO SYS_SEQUENCIADOR VALUES(UPPER(:TABELA) , UPPER(:CAMPO) ,
2);
ID_RETORNO = 1;
end
else
begin
/* Caso exista, recupera a seqüência armazenada*/
SELECT SEQUENCIA_VALOR
FROM SYS_SEQUENCIADOR
WHERE SEQUENCIA_TABELA = :TABELA
AND SEQUENCIA_CAMPO = :CAMPO
INTO :ID_SEQUENCIA;
/*Retorna com a sequencia Recuperada */
ID_RETORNO = :ID_SEQUENCIA;
/*Após recuperar o valor armazenado, incrementa com mais 1..*/
UPDATE SYS_SEQUENCIADOR
SET SEQUENCIA_VALOR = SEQUENCIA_VALOR + 1
WHERE SEQUENCIA_TABELA = :TABELA
AND SEQUENCIA_CAMPO = :CAMPO;
end
end
SUSPEND;
END^
SET TERM ; ^
--
_________________________________
T.·.F.·.A.·.
Fellipe Henrique
[EMAIL PROTECTED]
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral