[firebase-br] RES: Computed By com Stored Procedure

Rodrigo Bevilacqua Marcondes rodrigo em linceinformatica.com.br
Sex Jan 24 16:50:55 -03 2014


Olá Sandro Souza, boa tarde.

Agradeço muito pelo seu retorno, acho que assim deve resolver o problema.
Ou seja, criar uma view com algo que simule o campo calculado.
Mas o meu problema é que tenho um sistema legado, e queria modificar somente
o banco de dados um campo que hoje tem um valor, 
Para um campo calculado, pegando os valores em uma procedure.
Ai não precisaria mexer em nada no meu sistema - somente mudaria o campo no
BD.
Vou pesquisar mais a respeito para ver e consigo algo.
Ou se alguém tiver outra ideia é bem vinda.

Obrigado novamente Sandro, 

Abraços,

Rodrigo 


-----Mensagem original-----
De: Sandro Souza [mailto:escovadordebits em gmail.com] 
Enviada em: sexta-feira, 24 de janeiro de 2014 16:04
Para: FireBase; Rodrigo Bevilacqua Marcondes
Assunto: Re: [firebase-br] Computed BY com Stored Procedure

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