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

Responder a