[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