[firebase-br] Store Procedure - Parametros na Select
RAMJ SISTEMAS & CONSULTORIA
jubrovolski em yahoo.com.br
Dom Mar 6 10:52:12 -03 2005
Olá Pessoal
Já consegui resolver o problema. Esqueci de olhar no livro do Cantu.
Usei "EXECUTE STATEMENT" e resolveu meus problemas.
Reuber
RAMJ SISTEMAS & CONSULTORIA escreveu:
> 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;
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
> Para editar sua configuração na lista, use o endereço
> http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
>
>
Mais detalhes sobre a lista de discussão lista