[firebase-br] Store Procedure - Parametros na Select

RAMJ SISTEMAS & CONSULTORIA jubrovolski em yahoo.com.br
Dom Mar 6 10:33:34 -03 2005


Olá Pessoal

Implementei a seguinte SP em meus sistemas para gerar uma sequencia para 
os campos e guardos os registro não usados ( SuperSequenciador - matéira 
da Clube Delphi ). Porém como sou novato no assunto, estou apanhando um 
pouco para complementar o código. Gostaria que na sequencia entre ****** 
eu pudesse executar o seguinte: se ao acessar a primeira vez ele não 
achar nada na tabela sequenciador, ele verificasse se já houve registros 
dentro da tabela. Assim retornar o valor máximo do ID e somar mais 1. 
Porém não estou conseguindo passar os parametros :TABELA e :CAMPO para o 
Select. Quem puder me ajudar.


SET TERM ^ ;

CREATE PROCEDURE PRC_SEQUENCIADORA (
    TABELA CHAR(50),
    CAMPO CHAR(20),
    PENDENCIA INTEGER,
    VALORATUAL CHAR(10))
RETURNS (
    ID_RETORNO INTEGER)
AS
DECLARE VARIABLE MAXID INTEGER;
DECLARE VARIABLE ID_SEQUENCIA INTEGER;
BEGIN
  ID_SEQUENCIA = 0;
  /* Inclui uma Nova Pendencia na Tabela de Pendencias */
  if (Pendencia = 1) then
    begin
      INSERT INTO SEQUENCIADOR_PENDENCIAS
      VALUES(:TABELA ,:CAMPO ,:VALORATUAL);
     
      SUSPEND;
      exit;
    end

  if (exists(SELECT PENDENCIA_VALOR
             FROM SEQUENCIADOR_PENDENCIAS
             WHERE SEQUENCIA_TABELA = :TABELA
             AND SEQUENCIA_CAMPO    = :CAMPO)) then
    begin
      FOR SELECT PENDENCIA_VALOR
      FROM SEQUENCIADOR_PENDENCIAS
      WHERE SEQUENCIA_TABELA = :TABELA
      AND SEQUENCIA_CAMPO = :CAMPO
      ORDER BY PENDENCIA_VALOR DESC
      INTO :ID_SEQUENCIA DO
        BEGIN
          ID_RETORNO = :ID_SEQUENCIA;
        END
    end
  else
    ID_SEQUENCIA = 0;

  if (ID_SEQUENCIA <> 0) then
    begin
      ID_RETORNO = :ID_SEQUENCIA;
      DELETE FROM SEQUENCIADOR_PENDENCIAS
      WHERE SEQUENCIA_TABELA = :TABELA
      AND SEQUENCIA_CAMPO    = :CAMPO
      AND PENDENCIA_VALOR    = :ID_SEQUENCIA;

      SUSPEND;
      exit;
    end
  else
    begin
   
      if (not(exists(SELECT SEQUENCIA_VALOR
         FROM SEQUENCIADOR
         WHERE SEQUENCIA_TABELA = :TABELA
         AND SEQUENCIA_CAMPO    = :CAMPO))) then
        begin
*************************
          // se houver registros na tabela
          if (exists(select max(:CAMPO) from :tabela into maxid)) then
             begin
             INSERT INTO SEQUENCIADOR VALUES(:TABELA , :CAMPO , :maxid+2);
             ID_RETORNO = :maxid+1;
             end
          else // se nao houver registros
             begin
             INSERT INTO SEQUENCIADOR VALUES(:TABELA , :CAMPO , 2);
             ID_RETORNO = 1;
             end
********************
        end
      else
        begin
          SELECT SEQUENCIA_VALOR
          FROM SEQUENCIADOR
          WHERE SEQUENCIA_TABELA = :TABELA
          AND SEQUENCIA_CAMPO    = :CAMPO
          INTO :ID_SEQUENCIA;

          UPDATE SEQUENCIADOR
          SET SEQUENCIA_VALOR = SEQUENCIA_VALOR + 1
          WHERE SEQUENCIA_TABELA = :TABELA
          AND SEQUENCIA_CAMPO    = :CAMPO;

          ID_RETORNO = :ID_SEQUENCIA;
        end
       
    end
   
 SUSPEND;
END
^

SET TERM ; ^

GRANT SELECT,INSERT,DELETE ON SEQUENCIADOR_PENDENCIAS TO PROCEDURE 
PRC_SEQUENCIADORA;

GRANT EXECUTE ON PROCEDURE PRC_SEQUENCIADORA TO SYSDBA;



Mais detalhes sobre a lista de discussão lista