Algum tempo atrás foi publicado um post sobre Coluna Calculada Oracle , recentemente devido a limitação de um sistema, houve a necessidade de fazer uma coluna calculada usando um campo de outra tabela no Oracle.
Com isso surgiu a oportunidade de escrever um novo post, Coluna calculada com campo de outra tabela no Oracle, vamos ao exemplo.
Primeiramente será criada as tabelas utilizadas no exemplo, são tabelas simples, sem preocupação de performance e chaves.
CREATE TABLE T_CAMPOCALCULADO
(
NOME VARCHAR2(100),
SOBRENOME VARCHAR2(100)
);
CREATE TABLE T_ENDERECO
(
CODIGOENDERECO NUMBER(6) PRIMARY KEY,
ENDERECO VARCHAR2(100) NULL
);
Tabelas criadas, agora será adicionado um campo na tabela ‘T_CAMPOCALCULADO‘ que fará o relacionamento entre ambas tabelas.
ALTER TABLE T_CAMPOCALCULADO ADD CODIGOENDERECO NUMBER(6)
CONSTRAINT T_CAMPOCALCULADO_CODIGOENDERECO_FK REFERENCES T_ENDERECO(CODIGOENDERECO);
A forma utilizada nesse post para retornar um campo calculado de uma segunda tabela foi a criação de uma função que recebe por parâmetro o código que deve-se realizar o filtro, veja o exemplo:
CREATE OR REPLACE FUNCTION F_CAMPO_CALCULADO (V_CODIGOENDERECO NUMBER)
RETURN VARCHAR2 DETERMINISTIC AS
V_ENDERECO VARCHAR(100);
BEGIN
V_ENDERECO := '';
SELECT CAST(E.CODIGOENDERECO AS VARCHAR2(50)) || ' - ' || E.ENDERECO INTO V_ENDERECO
FROM T_ENDERECO E
WHERE CODIGOENDERECO = V_CODIGOENDERECO;
RETURN V_ENDERECO;
END;
Após criar a função, basta adicionar na tabela ‘T_CAMPOCALCULADO‘ o campo calculado baseado na função que foi criada, veja o exemplo:
ALTER TABLE T_CAMPOCALCULADO ADD DESCRICAO VARCHAR2(4000)
AS F_CAMPO_CALCULADO(CODIGOENDERECO)) virtual ;
Insira informações nas tabelas para que possa ser visto o resultado.
INSERT INTO T_ENDERECO (CODIGOENDERECO, ENDERECO) VALUES (1,'RUA 1');
INSERT INTO T_ENDERECO (CODIGOENDERECO, ENDERECO) VALUES (2,'RUA 2');
INSERT INTO T_ENDERECO (CODIGOENDERECO, ENDERECO) VALUES (3,'RUA 3');
INSERT INTO T_ENDERECO (CODIGOENDERECO, ENDERECO) VALUES (4,'RUA 4');
INSERT INTO T_ENDERECO (CODIGOENDERECO, ENDERECO) VALUES (5,'RUA 5');
INSERT INTO T_CAMPOCALCULADO (NOME, SOBRENOME, CODIGOENDERECO)
VALUES ('NOME 1', 'SOBRENONE 1', 2);
COMMIT;
Após realizar os inserts, pode-se fazer o select na tabela que possui o campo calculado para que possa ser visto o resultado.
SELECT *
FROM T_CAMPOCALCULADO;

Deve-se levar em consideração que, para cada registro da tabela ‘T_CAMPOCALCULADO‘ será disparada a função para retornar o campo calculado, com isso, deve-se avaliar se realmente vale a pena, mais saiba que é possível.