1
resposta

Checar se tabela existe

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!

1 resposta

Olá Esequiel, tudo bem?

Peço desculpas pela demora em ti retornar.

Não consegui compreender muito bem como funciona o seu código Esequiel. Você tentou execuar o comando para criar e truncar a tabela sem passar para uma variavel auxiliar ?

Aguardo o seu retorno!