Olá Sergio!
Tudo bem?
Estou com uma situação chata aqui e gostaria de saber se você pode me ajudar.
Vamos supor que eu queira fazer um processo de ETL e gerar uma tabela nova a partir deste. Você faria com uma procedure no Oracle?
Se fosse obrigatorio ser com PL/SQL, como você resolveria o seguinte problema...
Quero ler cliente e segmento de mercado e gerar uma dimensão cliente com os seguintes campos id, razao_social, CNPJ, segmento, categoria, cor. Sendo que a cor eu gerei uma função que calcula a cor de acordo com o faturamento_previsto.
O problema que estou enfrentando é que quando vou checar se a tabela existe, não funciona, pois dá erro de compilação já de cara já que o objeto não existe. No SQL_SERVER temos a vantagem do CREATE IF NOT EXISTS, mas aqui não estou conseguindo.
Minha ideia é criar a tabela dim_cliente caso ela não exista e truncar caso ela exista.
Como você faria para ficar mais elegante e profissional? SEGUE OS CÓDIGOS.
DECLARE
v_count NUMBER;
v_cor VARCHAR2(100);
v_sql LONG;
CURSOR cur_cliente IS
SELECT c.id, c.razao_social, c.cnpj, c.faturamento_previsto, c.categoria, s.descricao as segmento FROM cliente c
LEFT JOIN seg_mercado s ON s.id = c.id;
BEGIN
SELECT count(*) into v_count FROM user_tables where table_name = 'dim_cliente';
IF v_count <= 0 THEN
v_sql:='
create table dim_cliente(
id NUMBER(5),
razao_social VARCHAR2(100),
CNPJ VARCHAR2(20),
segmento VARCHAR2(100),
categoria VARCHAR2(20),
cor VARCHAR2(20),
CONSTRAINT dim_cliente_id_pk PRIMARY KEY(id))';
execute immediate v_sql; -- CREATE THE TABLE
ELSE
v_sql :='TRUNCATE TABLE dim_cliente';
execute immediate v_sql;
END IF;
FOR cli_rec IN cur_cliente LOOP
v_cor := define_cor_faturamento_empresa(cli_rec.faturamento_previsto);
INSERT INTO dim_cliente VALUES(cli_rec.id, cli_rec.razao_social, cli_rec.CNPJ, cli_rec.segmento, cli_rec.categoria, v_cor);
END LOOP;
COMMIT;
END;
FUNÇÃO COR
CREATE OR REPLACE FUNCTION define_cor_faturamento_empresa(
p_faturamento_previsto IN cliente.faturamento_previsto%type
)
RETURN cliente.categoria%type
IS
BEGIN
IF p_faturamento_previsto < 10000 THEN
RETURN 'VERMELHO';
ELSIF p_faturamento_previsto < 50000 THEN
RETURN 'LARANJA';
ELSIF p_faturamento_previsto < 100000 THEN
RETURN 'AMARELO';
ELSE
RETURN 'VERDE';
END IF;
END;
Eu poderia fazer manualmento conforme o código abaixo, mas quero deixar "dinâmico", ou seja, quero que o procedimento faça a checagem se a tabela existe para decidir se irá criar ou truncar.
create table dim_cliente(
id NUMBER(5),
razao_social VARCHAR2(100),
CNPJ VARCHAR2(20),
segmento VARCHAR2(100),
categoria VARCHAR2(20),
cor VARCHAR2(20),
CONSTRAINT dim_cliente_id_pk PRIMARY KEY(id)
);
-- BLOCO ETL
DECLARE
v_cor VARCHAR2(100);
CURSOR cur_cliente IS
SELECT c.id, c.razao_social, c.cnpj, c.faturamento_previsto, c.categoria, s.descricao as segmento FROM cliente c
LEFT JOIN seg_mercado s ON s.id = c.id;
BEGIN
FOR cli_rec IN cur_cliente LOOP
v_cor := define_cor_faturamento_empresa(cli_rec.faturamento_previsto);
INSERT INTO dim_cliente VALUES(cli_rec.id, cli_rec.razao_social, cli_rec.CNPJ, cli_rec.segmento, cli_rec.categoria, v_cor);
END LOOP;
COMMIT;
END;
Obrigado!