[firebase-br] Computed BY com Stored Procedure

Sandro Souza escovadordebits em gmail.com
Sex Jan 24 16:03:39 -03 2014


Bom dia/tarde/noite Rodrigo.

Meu nobre amigo, acredito que não seja possível utilizar SELECT na 
fórmula do COMPUTED BY.

Um caminho alternativo para isso seria criar uma VIEW que utilize todos 
os campos dessa tabela e que tenha mais esse campo calculado com o 
SELECT que você desejar.

Depois você cria os respectivos gatilhos para os eventos BEFORE INSERT, 
BEFORE UPDATE e BEFORE DELETE para essa visão, de forma que ela se 
comporte realmente como a tabela original, podendo inserir, alterar e 
excluir dela.

Não sei se você está familiarizado com as visões alteráveis, então deixo 
aqui um pequeno exemplo de como seria.

Primeiro uma tabela de exemplo:

CREATE TABLE TESTE(
   CODIGO INTEGER NOT NULL,
   DESCRICAO VARCHAR(200) CHARACTER SET ISO8859_1 NOT NULL COLLATE PT_BR,
   CONSTRAINT PK_TESTE PRIMARY KEY(CODIGO),
   CONSTRAINT UK_TESTE_DESCRICAO UNIQUE(DESCRICAO));

COMMENT ON TABLE TESTE IS 'Tabela de exemplo';

COMMENT ON COLUMN TESTE.CODIGO IS 'Codigo do registro';

COMMENT ON COLUMN TESTE.DESCRICAO IS 'Descricao do registro';

Agora uma stored procedure selecionável para esse exemplo:

SET TERM ^ ;

CREATE OR ALTER PROCEDURE MINHA_PROCEDURE(
   VALOR_QUALQUER INTEGER
)RETURNS(
   RESULTADO INTEGER
)AS
BEGIN
   -- Faz um calculo qualquer apenas para o exemplo.
   RESULTADO = 2 * VALOR_QUALQUER;
   -- Retorna o resultado.
   SUSPEND;
END^

SET TERM ;  ^

Agora a visão alterável dessa tabela TESTE:

CREATE VIEW VISAO_TESTE(
   CODIGO,
   DESCRICAO,
   CALCULADO)AS
SELECT
   CODIGO,
   DESCRICAO,
   (SELECT RESULTADO FROM MINHA_PROCEDURE(CODIGO))
FROM
   TESTE;

COMMENT ON VIEW VISAO_TESTE IS 'Visao alteravel da tabela TESTE';

COMMENT ON COLUMN VISAO_TESTE.CODIGO IS 'Codigo do registro';

COMMENT ON COLUMN VISAO_TESTE.DESCRICAO IS 'Descricao do registro';

COMMENT ON COLUMN VISAO_TESTE.CALCULADO IS 'Campo calculado de exemplo';

Para a visão VISAO_TESTE tornar-se alterável/editável, vamos criar os 
respectivos gatilhos:

SET TERM ^ ;

CREATE OR ALTER TRIGGER TR_BD_VISAO_TESTE FOR VISAO_TESTE BEFORE DELETE AS
BEGIN
   -- Exclui/deleta o registro da tabela TESTE.
   DELETE FROM TESTE WHERE CODIGO = OLD.CODIGO;
END^

CREATE OR ALTER TRIGGER TR_BI_VISAO_TESTE FOR VISAO_TESTE BEFORE INSERT AS
BEGIN
   -- Insere o registro na tabela TESTE.
   INSERT INTO TESTE(
     CODIGO,
     DESCRICAO
   )VALUES(
     NEW.CODIGO,
     NEW.DESCRICAO);
END^

CREATE OR ALTER TRIGGER TR_BU_VISAO_TESTE FOR VISAO_TESTE BEFORE UPDATE AS
BEGIN
   -- Atualiza o registro da tabela TESTE.
   UPDATE TESTE SET
     CODIGO = NEW.CODIGO,
     DESCRICAO = NEW.DESCRICAO
  WHERE
     CODIGO = OLD.CODIGO;
END^

SET TERM ; ^

Agora é só testar:

1 - Vamos inserir alguns registros.

INSERT INTO VISAO_TESTE(CODIGO,DESCRICAO)VALUES(1,'Fulano');
INSERT INTO VISAO_TESTE(CODIGO,DESCRICAO)VALUES(2,'Beltrano');
INSERT INTO VISAO_TESTE(CODIGO,DESCRICAO)VALUES(3,'Sicrano');

2 - Agora vamos ver o resultado.

SELECT * FROM VISAO_TESTE;

3 - E como ficou a tabela TESTE?

SELECT * FROM TESTE;

Espero ter ajudado mais que atrapalhado. :D

Em 24-01-2014 14:02, Rodrigo Bevilacqua Marcondes escreveu:
> Olá Pessoal,
>
> Gostaria de saber se é possível chamar PROCEDURE dentro de um campo COMPUTED
> BY.
>
> Estou tentando fazer assim:
> select (select osaldo_ from  fin_saldo ('2','01.01.2014'))  from
> rdb$database
> ou
> (select (select osaldo_ from  fin_saldo ('2','01.01.2014'))  from
> rdb$database)
>
> mas da erro dizendo que o select não é reconhecido.
>
> Alguém tem alguma sugestão para me auxiliar.
>
> Obrigado,
>
> Rodrigo
>
>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use: http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa





Mais detalhes sobre a lista de discussão lista