Procedure está dando insert e não update

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
pnet1
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 73
Registrado em: Qui, 23 Jan 2020 9:12 pm

Estou tendo o seguinte problema. Tenho uma procedure que recebe um parâmetro do tipo clob. Tem uma rotina feita em APEX que pega essa planilha e sobe e a procedure consome. O que está acontecendo? Bem, quando o gestor sobe a planilha de forma errada, ele então faz a correção e tenta subir de novo. O que acontece, que nessa segunda subida, a procedure deveria fazer um Update e o que parece está dando Insert(dobrando/triplicando as linhas, para o mesmo registro), porem quando se faz essa alteração, acredito que muda alguma coisa e o registro passa a ser outro, por isso, creio eu, que é feito o Insert. Peguei a proc e confesso, apanhei um pouco para entender e por isso eu a colo aqui nesse post, pedindo a ajuda de vocês para eu entyender se estou certo ou não e porque o sistema entende ser um registro diferente. Enquanto isso, sigo em minha análise também. Qualquer ajuda é super bem vinda.

Selecionar tudo

create or replace PROCEDURE prc_grava_visita (
    p_clob     IN         CLOB,
    p_result   OUT        VARCHAR2
) AS

    v_exception                        VARCHAR2(100);
    v_check                            VARCHAR2(5);
    v_json_obj                         json_object_t;
    v_visita_arr                       json_array_t;
    v_visita_obj                       json_object_t;
    v_publicacao_arr                   json_array_t;
    v_publicacao_obj                   json_object_t;
    v_pesquisa_arr                     json_array_t;
    v_pesquisa_obj                     json_object_t;
    v_ativos_arr                       json_array_t;
    v_ativos_obj                       json_object_t;
    --trade_publicado_result
    vvis_matricula                     VARCHAR2(10);
    vvis_dt_coleta                     DATE;
    vvis_id_visita                     VARCHAR2(255);
    vvis_codigo_cliente                NUMBER;
    vvis_id_visita_agendada            NUMBER;
    vvis_id_status                     NUMBER;
    vvis_matricula_supervisor          VARCHAR2(10);
    vvis_matricula_executivo           VARCHAR2(10);
    vvis_matricula_gerente             VARCHAR2(10);
    vvis_hora_planejada_checkin        TIMESTAMP(6);
    vvis_hora_checkin                  TIMESTAMP(6);
    vvis_hora_planejada_checkout       TIMESTAMP(6);
    vvis_hora_checkout                 TIMESTAMP(6);
    vvis_dt_sincronismo                DATE;
    vvis_nota_presenca                 VARCHAR2(255);
    vvis_nota_promocao                 VARCHAR2(255);
    vvis_nota_preço                    VARCHAR2(255);
    vvis_nota_posicionamento           VARCHAR2(255);
    vvis_nota_geral                    VARCHAR2(255);
    vvis_id_filtro_regional            NUMBER;
    vvis_id_filtro_formato             NUMBER;
    vvis_id_filtro_bandeira            NUMBER;
    vvis_id_filtro_estado              NUMBER;
    vvis_id_filtro_cidade              NUMBER;
    vvis_id_motivo_cancelamento        NUMBER;
    vvis_foto_nome                     VARCHAR2(255);
    vvis_foto_tipo_arquivo             VARCHAR2(255);
    vvis_nota_coaching                 VARCHAR2(255);
    vvis_matricula_promotor_avaliado   VARCHAR2(255);
    vvis_foto_checkin                  CLOB;
    vvis_matricula_diretor             VARCHAR2(10);
    vvis_id_filtro_rede                NUMBER;
    vvis_id_modulo                     NUMBER;
    --trade_grupo_publicacao
    vpub_id_visita                     VARCHAR2(255);
    vpub_id_publicacao                 NUMBER;
    vpub_matricula                     VARCHAR2(10);
    vpub_dt_coleta                     DATE;
    vpub_codigo_cliente                NUMBER;
    vpub_count                         NUMBER;
    --trade_pesquisa_result
    vpes_id_pesquisa_result            VARCHAR2(255);
    vpes_id_pesquisa_pub               NUMBER;
    vpes_dt_coleta                     DATE;
    vpes_id_objetivo                   NUMBER;
    vpes_hora_inicio                   TIMESTAMP(6);
    vpes_hora_fim                      TIMESTAMP(6);
    vpes_dt_sincronismo                DATE;
    vpes_matricula                     VARCHAR2(10);
    vpes_id_visita                     VARCHAR2(255);
    vpes_id_modulo                     NUMBER;
    --ativos
    vati_id_centro                     VARCHAR2(10);
    vati_id_ativo                      NUMBER;
    vati_ds_ativo                      VARCHAR2(50);
    vati_ds_tipo_rtm                   VARCHAR2(50);
    vati_qt_saldo_sap                  NUMBER;
    vati_id_grupo_cliente              VARCHAR2(3);
    vati_ds_grupo_cliente              VARCHAR2(50);
    vati_id_ativo_contrato             NUMBER;
    vati_dt_emissao                    DATE;
    vati_dt_vencimento                 DATE;
    vati_id_canal_distribuicao         VARCHAR2(10);
    vati_id_setor_atividade            VARCHAR2(10);
    vati_id_ativo_motivo               NUMBER;
    vati_ds_observacao                 CLOB;
    vati_id_visita                     VARCHAR2(255);
    vati_qt_saldo_coleta               NUMBER;
BEGIN
    SELECT
        CASE
            WHEN p_clob IS JSON THEN
                'TRUE'
            ELSE
                'FALSE'
        END
    INTO v_check
    FROM
        dual;

    IF v_check = 'TRUE' THEN
        v_exception := 'É JSON';
        --v_json_obj := json_object_t(replace(replace(p_clob, '{"ID_VISITA"', '[{"ID_VISITA"'), '},"Publicacoes"', '}],"Publicacoes"'));
        v_json_obj := json_object_t(p_clob);
        v_visita_arr := v_json_obj.get_array('Visitas');
        FOR i IN 0..v_visita_arr.get_size - 1 LOOP
            v_visita_obj := TREAT(v_visita_arr.get(i) AS json_object_t);
            vvis_matricula := v_visita_obj.get_string('MATRICULA');
            vvis_dt_coleta := TO_DATE(v_visita_obj.get_string('DT_COLETA'), 'DD/MM/YY');
            vvis_id_visita := v_visita_obj.get_string('ID_VISITA');
            vvis_codigo_cliente := v_visita_obj.get_string('CODIGO_CLIENTE');
            vvis_id_visita_agendada := v_visita_obj.get_string('ID_VISITA_AGENDADA');
            vvis_id_status := v_visita_obj.get_string('ID_STATUS');
            vvis_matricula_supervisor := v_visita_obj.get_string('MATRICULA_SUPERVISOR');
            vvis_matricula_executivo := v_visita_obj.get_string('MATRICULA_EXECUTIVO');
            vvis_matricula_gerente := v_visita_obj.get_string('MATRICULA_GERENTE');
            vvis_hora_planejada_checkin := to_timestamp(v_visita_obj.get_string('HORA_PLANEJADA_CHECKIN'), 'DD/MM/YY HH24:MI:SS')
            ;
            vvis_hora_checkin := to_timestamp(v_visita_obj.get_string('HORA_CHECKIN'), 'DD/MM/YY HH24:MI:SS');
            vvis_hora_planejada_checkout := to_timestamp(v_visita_obj.get_string('HORA_PLANEJADA_CHECKOUT'), 'DD/MM/YY HH24:MI:SS'
            );
            vvis_hora_checkout := to_timestamp(v_visita_obj.get_string('HORA_CHECKOUT'), 'DD/MM/YY HH24:MI:SS');
            vvis_dt_sincronismo := TO_DATE(v_visita_obj.get_string('DT_SINCRONISMO'), 'DD/MM/YY');
            vvis_nota_presenca := v_visita_obj.get_string('NOTA_PRESENCA');
            vvis_nota_promocao := v_visita_obj.get_string('NOTA_PROMOCAO');
            vvis_nota_preço := v_visita_obj.get_string('NOTA_preço');
            vvis_nota_posicionamento := v_visita_obj.get_string('NOTA_POSICIONAMENTO');
            vvis_nota_geral := v_visita_obj.get_string('NOTA_GERAL');
            vvis_id_filtro_regional := v_visita_obj.get_string('ID_FILTRO_REGIONAL');
            vvis_id_filtro_formato := v_visita_obj.get_string('ID_FILTRO_FORMATO');
            vvis_id_filtro_bandeira := v_visita_obj.get_string('ID_FILTRO_BANDEIRA');
            vvis_id_filtro_estado := v_visita_obj.get_string('ID_FILTRO_ESTADO');
            vvis_id_filtro_cidade := v_visita_obj.get_string('ID_FILTRO_CIDADE');
            vvis_id_motivo_cancelamento := v_visita_obj.get_string('ID_MOTIVO_CANCELAMENTO');
            vvis_foto_nome := v_visita_obj.get_string('FILE_NAME');
            vvis_foto_tipo_arquivo := v_visita_obj.get_string('FILE_MIMETYPE');
            vvis_nota_coaching := v_visita_obj.get_string('nota_coaching');
            vvis_matricula_promotor_avaliado := v_visita_obj.get_string('matricula_promotor_avaliado');
            vvis_foto_checkin := v_visita_obj.get_string('FOTO_CHECKIN');
            vvis_matricula_diretor := v_visita_obj.get_string('MATRICULA_DIRETOR');
            vvis_id_filtro_rede := v_visita_obj.get_string('ID_FILTRO_REDE');
            vvis_id_modulo := v_visita_obj.get_string('ID_MODULO');
            UPDATE trade_publicado_result
            SET
                codigo_cliente = vvis_codigo_cliente,
                id_status = vvis_id_status,
                id_visita_agendada = vvis_id_visita_agendada,
                matricula_supervisor = vvis_matricula_supervisor,
                matricula_executivo = vvis_matricula_executivo,
                matricula_gerente = vvis_matricula_gerente,
                hora_planejada_checkin = vvis_hora_planejada_checkin,
                hora_checkin = vvis_hora_checkin,
                hora_planejada_checkout = vvis_hora_planejada_checkout,
                hora_checkout = vvis_hora_checkout,
                dt_sincronismo = vvis_dt_sincronismo,
                nota_presenca = vvis_nota_presenca,
                nota_promocao = vvis_nota_promocao,
                nota_preço = vvis_nota_preço,
                nota_posicionamento = vvis_nota_posicionamento,
                nota_geral = vvis_nota_geral,
                id_filtro_regional = nvl(vvis_id_filtro_regional,(
                    SELECT
                        fc.id_filtro
                    FROM
                        trade_filtro f
                        INNER JOIN trade_filtro_cliente fc ON f.id_filtro = fc.id_filtro
                                                              AND f.tipo_filtro = fc.tipo_filtro
                                                              AND f.id_modulo = fc.id_modulo
                    WHERE
                        f.id_modulo = vvis_id_modulo
                        AND f.tipo_filtro = 'REGIONAL'
                        AND f.ativo = 'S'
                        AND fc.codigo_cliente = vvis_codigo_cliente
                        AND ROWNUM = 1
                )),
                id_filtro_formato = nvl(vvis_id_filtro_formato,(
                    SELECT
                        fc.id_filtro
                    FROM
                        trade_filtro f
                        INNER JOIN trade_filtro_cliente fc ON f.id_filtro = fc.id_filtro
                                                              AND f.tipo_filtro = fc.tipo_filtro
                                                              AND f.id_modulo = fc.id_modulo
                    WHERE
                        f.id_modulo = vvis_id_modulo
                        AND f.tipo_filtro = 'FORMATO'
                        AND f.ativo = 'S'
                        AND fc.codigo_cliente = vvis_codigo_cliente
                        AND ROWNUM = 1
                )),
                id_filtro_bandeira = nvl(vvis_id_filtro_bandeira,(
                    SELECT
                        fc.id_filtro
                    FROM
                        trade_filtro f
                        INNER JOIN trade_filtro_cliente fc ON f.id_filtro = fc.id_filtro
                                                              AND f.tipo_filtro = fc.tipo_filtro
                                                              AND f.id_modulo = fc.id_modulo
                    WHERE
                        f.id_modulo = vvis_id_modulo
                        AND f.tipo_filtro = 'BANDEIRA'
                        AND f.ativo = 'S'
                        AND fc.codigo_cliente = vvis_codigo_cliente
                        AND ROWNUM = 1
                )),
                id_filtro_estado = nvl(vvis_id_filtro_estado,(
                    SELECT
                        fc.id_filtro
                    FROM
                        trade_filtro f
                        INNER JOIN trade_filtro_cliente fc ON f.id_filtro = fc.id_filtro
                                                              AND f.tipo_filtro = fc.tipo_filtro
                                                              AND f.id_modulo = fc.id_modulo
                    WHERE
                        f.id_modulo = vvis_id_modulo
                        AND f.tipo_filtro = 'ESTADO'
                        AND f.ativo = 'S'
                        AND fc.codigo_cliente = vvis_codigo_cliente
                        AND ROWNUM = 1
                )),
                id_filtro_cidade = nvl(vvis_id_filtro_cidade,(
                    SELECT
                        fc.id_filtro
                    FROM
                        trade_filtro f
                        INNER JOIN trade_filtro_cliente fc ON f.id_filtro = fc.id_filtro
                                                              AND f.tipo_filtro = fc.tipo_filtro
                                                              AND f.id_modulo = fc.id_modulo
                    WHERE
                        f.id_modulo = vvis_id_modulo
                        AND f.tipo_filtro = 'CIDADE'
                        AND f.ativo = 'S'
                        AND fc.codigo_cliente = vvis_codigo_cliente
                        AND ROWNUM = 1
                )),
                id_filtro_org_venda = (
                    SELECT
                        fc.id_filtro
                    FROM
                        trade_filtro f
                        INNER JOIN trade_filtro_cliente fc ON f.id_filtro = fc.id_filtro
                                                              AND f.tipo_filtro = fc.tipo_filtro
                                                              AND f.id_modulo = fc.id_modulo
                    WHERE
                        f.id_modulo = vvis_id_modulo
                        AND f.tipo_filtro = 'ORGANIZAÇÃO DE VENDA'
                        AND f.ativo = 'S'
                        AND fc.codigo_cliente = vvis_codigo_cliente
                        AND ROWNUM = 1
                ),
                id_filtro_cat_cliente = (
                    SELECT
                        fc.id_filtro
                    FROM
                        trade_filtro f
                        INNER JOIN trade_filtro_cliente fc ON f.id_filtro = fc.id_filtro
                                                              AND f.tipo_filtro = fc.tipo_filtro
                                                              AND f.id_modulo = fc.id_modulo
                    WHERE
                        f.id_modulo = vvis_id_modulo
                        AND f.tipo_filtro = 'CATEGORIA DE CLIENTE'
                        AND f.ativo = 'S'
                        AND fc.codigo_cliente = vvis_codigo_cliente
                        AND ROWNUM = 1
                ),
                id_filtro_grupo_cliente = (
                    SELECT
                        fc.id_filtro
                    FROM
                        trade_filtro f
                        INNER JOIN trade_filtro_cliente fc ON f.id_filtro = fc.id_filtro
                                                              AND f.tipo_filtro = fc.tipo_filtro
                                                              AND f.id_modulo = fc.id_modulo
                    WHERE
                        f.id_modulo = vvis_id_modulo
                        AND f.tipo_filtro = 'GRUPO DE CLIENTE'
                        AND f.ativo = 'S'
                        AND fc.codigo_cliente = vvis_codigo_cliente
                        AND ROWNUM = 1
                ),
                id_motivo_cancelamento = vvis_id_motivo_cancelamento,
                foto_nome = vvis_foto_nome,
                foto_tipo_arquivo = vvis_foto_tipo_arquivo,
                nota_coaching = vvis_nota_coaching,
                matricula_promotor_avaliado = vvis_matricula_promotor_avaliado,
                foto_checkin = vvis_foto_checkin,
                matricula_diretor = vvis_matricula_diretor,
                id_filtro_rede = nvl(vvis_id_filtro_rede,(
                    SELECT
                        fc.id_filtro
                    FROM
                        trade_filtro f
                        INNER JOIN trade_filtro_cliente fc ON f.id_filtro = fc.id_filtro
                                                              AND f.tipo_filtro = fc.tipo_filtro
                                                              AND f.id_modulo = fc.id_modulo
                    WHERE
                        f.id_modulo = vvis_id_modulo
                        AND f.tipo_filtro = 'REDE'
                        AND f.ativo = 'S'
                        AND fc.codigo_cliente = vvis_codigo_cliente
                        AND ROWNUM = 1
                ))
            WHERE
                id_visita = vvis_id_visita
                AND matricula = vvis_matricula
                AND id_modulo = vvis_id_modulo;

            IF SQL%rowcount = 0 THEN
                INSERT INTO trade_publicado_result (
                    matricula,
                    dt_coleta,
                    id_visita,
                    codigo_cliente,
                    id_visita_agendada,
                    id_status,
                    matricula_supervisor,
                    matricula_executivo,
                    matricula_gerente,
                    hora_planejada_checkin,
                    hora_checkin,
                    hora_planejada_checkout,
                    hora_checkout,
                    dt_sincronismo,
                    nota_presenca,
                    nota_promocao,
                    nota_preço,
                    nota_posicionamento,
                    nota_geral,
                    id_filtro_regional,
                    id_filtro_formato,
                    id_filtro_bandeira,
                    id_filtro_estado,
                    id_filtro_cidade,
                    id_filtro_org_venda,
                    id_filtro_cat_cliente,
                    id_filtro_grupo_cliente,
                    id_motivo_cancelamento,
                    foto_nome,
                    foto_tipo_arquivo,
                    nota_coaching,
                    matricula_promotor_avaliado,
                    foto_checkin,
                    matricula_diretor,
                    id_filtro_rede,
                    id_modulo
                ) VALUES (
                    vvis_matricula,
                    vvis_dt_coleta,
                    vvis_id_visita,
                    vvis_codigo_cliente,
                    vvis_id_visita_agendada,
                    vvis_id_status,
                    vvis_matricula_supervisor,
                    vvis_matricula_executivo,
                    vvis_matricula_gerente,
                    vvis_hora_planejada_checkin,
                    vvis_hora_checkin,
                    vvis_hora_planejada_checkout,
                    vvis_hora_checkout,
                    vvis_dt_sincronismo,
                    vvis_nota_presenca,
                    vvis_nota_promocao,
                    vvis_nota_preço,
                    vvis_nota_posicionamento,
                    vvis_nota_geral,
                    nvl(vvis_id_filtro_regional,(
                        SELECT
                            fc.id_filtro
                        FROM
                            trade_filtro f
                            INNER JOIN trade_filtro_cliente fc ON f.id_filtro = fc.id_filtro
                                                                  AND f.tipo_filtro = fc.tipo_filtro
                                                                  AND f.id_modulo = fc.id_modulo
                        WHERE
                            f.id_modulo = vvis_id_modulo
                            AND f.tipo_filtro = 'REGIONAL'
                            AND f.ativo = 'S'
                            AND fc.codigo_cliente = vvis_codigo_cliente
                            AND ROWNUM = 1
                    )),
                    nvl(vvis_id_filtro_formato,(
                        SELECT
                            fc.id_filtro
                        FROM
                            trade_filtro f
                            INNER JOIN trade_filtro_cliente fc ON f.id_filtro = fc.id_filtro
                                                                  AND f.tipo_filtro = fc.tipo_filtro
                                                                  AND f.id_modulo = fc.id_modulo
                        WHERE
                            f.id_modulo = vvis_id_modulo
                            AND f.tipo_filtro = 'FORMATO'
                            AND f.ativo = 'S'
                            AND fc.codigo_cliente = vvis_codigo_cliente
                            AND ROWNUM = 1
                    )),
                    nvl(vvis_id_filtro_bandeira,(
                        SELECT
                            fc.id_filtro
                        FROM
                            trade_filtro f
                            INNER JOIN trade_filtro_cliente fc ON f.id_filtro = fc.id_filtro
                                                                  AND f.tipo_filtro = fc.tipo_filtro
                                                                  AND f.id_modulo = fc.id_modulo
                        WHERE
                            f.id_modulo = vvis_id_modulo
                            AND f.tipo_filtro = 'BANDEIRA'
                            AND f.ativo = 'S'
                            AND fc.codigo_cliente = vvis_codigo_cliente
                            AND ROWNUM = 1
                    )),
                    nvl(vvis_id_filtro_estado,(
                        SELECT
                            fc.id_filtro
                        FROM
                            trade_filtro f
                            INNER JOIN trade_filtro_cliente fc ON f.id_filtro = fc.id_filtro
                                                                  AND f.tipo_filtro = fc.tipo_filtro
                                                                  AND f.id_modulo = fc.id_modulo
                        WHERE
                            f.id_modulo = vvis_id_modulo
                            AND f.tipo_filtro = 'ESTADO'
                            AND f.ativo = 'S'
                            AND fc.codigo_cliente = vvis_codigo_cliente
                            AND ROWNUM = 1
                    )),
                    nvl(vvis_id_filtro_cidade,(
                        SELECT
                            fc.id_filtro
                        FROM
                            trade_filtro f
                            INNER JOIN trade_filtro_cliente fc ON f.id_filtro = fc.id_filtro
                                                                  AND f.tipo_filtro = fc.tipo_filtro
                                                                  AND f.id_modulo = fc.id_modulo
                        WHERE
                            f.id_modulo = vvis_id_modulo
                            AND f.tipo_filtro = 'CIDADE'
                            AND f.ativo = 'S'
                            AND fc.codigo_cliente = vvis_codigo_cliente
                            AND ROWNUM = 1
                    )),
                    (
                        SELECT
                            fc.id_filtro
                        FROM
                            trade_filtro f
                            INNER JOIN trade_filtro_cliente fc ON f.id_filtro = fc.id_filtro
                                                                  AND f.tipo_filtro = fc.tipo_filtro
                                                                  AND f.id_modulo = fc.id_modulo
                        WHERE
                            f.id_modulo = vvis_id_modulo
                            AND f.tipo_filtro = 'ORGANIZAÇÃO DE VENDA'
                            AND f.ativo = 'S'
                            AND fc.codigo_cliente = vvis_codigo_cliente
                            AND ROWNUM = 1
                    ),
                    (
                        SELECT
                            fc.id_filtro
                        FROM
                            trade_filtro f
                            INNER JOIN trade_filtro_cliente fc ON f.id_filtro = fc.id_filtro
                                                                  AND f.tipo_filtro = fc.tipo_filtro
                                                                  AND f.id_modulo = fc.id_modulo
                        WHERE
                            f.id_modulo = vvis_id_modulo
                            AND f.tipo_filtro = 'CATEGORIA DE CLIENTE'
                            AND f.ativo = 'S'
                            AND fc.codigo_cliente = vvis_codigo_cliente
                            AND ROWNUM = 1
                    ),
                    (
                        SELECT
                            fc.id_filtro
                        FROM
                            trade_filtro f
                            INNER JOIN trade_filtro_cliente fc ON f.id_filtro = fc.id_filtro
                                                                  AND f.tipo_filtro = fc.tipo_filtro
                                                                  AND f.id_modulo = fc.id_modulo
                        WHERE
                            f.id_modulo = vvis_id_modulo
                            AND f.tipo_filtro = 'GRUPO DE CLIENTE'
                            AND f.ativo = 'S'
                            AND fc.codigo_cliente = vvis_codigo_cliente
                            AND ROWNUM = 1
                    ),
                    vvis_id_motivo_cancelamento,
                    vvis_foto_nome,
                    vvis_foto_tipo_arquivo,
                    vvis_nota_coaching,
                    vvis_matricula_promotor_avaliado,
                    vvis_foto_checkin,
                    vvis_matricula_diretor,
                    nvl(vvis_id_filtro_rede,(
                        SELECT
                            fc.id_filtro
                        FROM
                            trade_filtro f
                            INNER JOIN trade_filtro_cliente fc ON f.id_filtro = fc.id_filtro
                                                                  AND f.tipo_filtro = fc.tipo_filtro
                                                                  AND f.id_modulo = fc.id_modulo
                        WHERE
                            f.id_modulo = vvis_id_modulo
                            AND f.tipo_filtro = 'REDE'
                            AND f.ativo = 'S'
                            AND fc.codigo_cliente = vvis_codigo_cliente
                            AND ROWNUM = 1
                    )),
                    vvis_id_modulo
                );

                v_exception := 'INSERT realizado em TRADE_PUBLICADO_RESULT';
            ELSE
                v_exception := 'UPDATE realizado em TRADE_PUBLICADO_RESULT';
            END IF;

        END LOOP;

        v_publicacao_arr := v_json_obj.get_array('Publicacoes');
        FOR i IN 0..v_publicacao_arr.get_size - 1 LOOP
            v_publicacao_obj := TREAT(v_publicacao_arr.get(i) AS json_object_t);
            vpub_id_visita := v_publicacao_obj.get_string('ID_VISITA');
            vpub_id_publicacao := v_publicacao_obj.get_number('ID_PUBLICACAO');
            vpub_matricula := v_publicacao_obj.get_string('MATRICULA');
            vpub_dt_coleta := TO_DATE(v_publicacao_obj.get_string('DT_COLETA'), 'DD/MM/YY');
            vpub_codigo_cliente := nvl(v_publicacao_obj.get_string('CODIGO_CLIENTE'), vvis_codigo_cliente);
            SELECT
                nvl((
                    SELECT
                        COUNT(*)
                    FROM
                        trade_grupo_publicacao
                    WHERE
                        id_visita = vpub_id_visita
                        AND id_publicacao = vpub_id_publicacao
                        AND matricula = vpub_matricula
                        AND dt_coleta = vpub_dt_coleta
                ), 0)
            INTO vpub_count
            FROM
                dual;

            IF vpub_count = 0 THEN
                INSERT INTO trade_grupo_publicacao (
                    id_visita,
                    id_publicacao,
                    matricula,
                    dt_coleta,
                    codigo_cliente
                ) VALUES (
                    vpub_id_visita,
                    vpub_id_publicacao,
                    vpub_matricula,
                    vpub_dt_coleta,
                    vpub_codigo_cliente
                );

                v_exception := 'INSERT realizado em TRADE_GRUPO_PUBLICACAO';
            END IF;

        END LOOP;

        v_pesquisa_arr := v_json_obj.get_array('Pesquisas');
        FOR i IN 0..v_pesquisa_arr.get_size - 1 LOOP
            v_pesquisa_obj := TREAT(v_pesquisa_arr.get(i) AS json_object_t);
            vpes_id_pesquisa_result := v_pesquisa_obj.get_string('ID_PESQUISA_RESULT');
            vpes_id_pesquisa_pub := v_pesquisa_obj.get_number('ID_PESQUISA_PUB');
            vpes_dt_coleta := TO_DATE(v_pesquisa_obj.get_string('DT_COLETA'), 'DD/MM/YY');
            vpes_id_objetivo := v_pesquisa_obj.get_number('ID_OBJETIVO');
            vpes_hora_inicio := to_timestamp(v_pesquisa_obj.get_string('HORA_INICIO'), 'DD/MM/YY HH24:MI:SS');
            vpes_hora_fim := to_timestamp(v_pesquisa_obj.get_string('HORA_FIM'), 'DD/MM/YY HH24:MI:SS');
            vpes_dt_sincronismo := TO_DATE(v_pesquisa_obj.get_string('DT_SINCRONISMO'), 'DD/MM/YY');
            vpes_matricula := v_pesquisa_obj.get_string('MATRICULA');
            vpes_id_visita := v_pesquisa_obj.get_string('ID_VISITA');
            vpes_id_modulo := v_pesquisa_obj.get_number('ID_MODULO');
            UPDATE trade_pesquisa_result
            SET
                id_objetivo = vpes_id_objetivo,
                hora_inicio = vpes_hora_inicio,
                hora_fim = vpes_hora_fim,
                dt_sincronismo = vpes_dt_sincronismo,
                matricula = vpes_matricula,
                dt_update = trunc(SYSDATE)
            WHERE
                id_pesquisa_result = vpes_id_pesquisa_result
                AND id_modulo = vpes_id_modulo;

            IF SQL%rowcount = 0 THEN
                INSERT INTO trade_pesquisa_result (
                    id_pesquisa_result,
                    id_pesquisa_pub,
                    dt_coleta,
                    id_objetivo,
                    hora_inicio,
                    hora_fim,
                    dt_sincronismo,
                    matricula,
                    id_visita,
                    dt_update,
                    id_modulo
                ) VALUES (
                    vpes_id_pesquisa_result,
                    vpes_id_pesquisa_pub,
                    vpes_dt_coleta,
                    vpes_id_objetivo,
                    vpes_hora_inicio,
                    vpes_hora_fim,
                    vpes_dt_sincronismo,
                    vpes_matricula,
                    vpes_id_visita,
                    trunc(SYSDATE),
                    vpes_id_modulo
                );

                v_exception := 'INSERT realizado em TRADE_PESQUISA_RESULT';
            ELSE
                v_exception := 'UPDATE realizado em TRADE_PESQUISA_RESULT';
            END IF;

        END LOOP;

        v_ativos_arr := v_json_obj.get_array('Ativos');
        FOR i IN 0..v_ativos_arr.get_size - 1 LOOP
            v_ativos_obj := TREAT(v_ativos_arr.get(i) AS json_object_t);
            vati_id_centro := v_ativos_obj.get_string('CENTRO');
            vati_id_ativo := v_ativos_obj.get_string('MATERIAL');
            vati_ds_ativo := v_ativos_obj.get_string('MATERIAL_DESC');
            vati_ds_tipo_rtm := v_ativos_obj.get_string('TIPO_RTM');
            vati_qt_saldo_sap := v_ativos_obj.get_string('SALDO_ANTERIOR');
            vati_id_grupo_cliente := v_ativos_obj.get_string('GRUPO_CLIENTES');
            vati_ds_grupo_cliente := v_ativos_obj.get_string('GRUPO_CLIENTES_DESC');
            vati_id_ativo_contrato := v_ativos_obj.get_string('CONTRATO');
            vati_dt_emissao := TO_DATE(v_ativos_obj.get_string('CONTRATO_DATA_EMISSAO'), 'DD/MM/YY');
            vati_dt_vencimento := TO_DATE(v_ativos_obj.get_string('CONTRATO_DATA_VENCIMENTO'), 'DD/MM/YY');
            vati_id_canal_distribuicao := v_ativos_obj.get_string('CANAL_DISTRIBUICAO');
            vati_id_setor_atividade := v_ativos_obj.get_string('SETOR_ATIVIDADE');
            vati_id_ativo_motivo := v_ativos_obj.get_number('ID_MOTIVO');
            vati_ds_observacao := v_ativos_obj.get_string('OBSERVACOES');
            vati_id_visita := v_ativos_obj.get_string('ID_VISITA');
            vati_qt_saldo_coleta := v_ativos_obj.get_number('SALDO_VERIFICADO');
            UPDATE trade_ativo
            SET
                ds_ativo = vati_ds_ativo,
                dt_update = DECODE(ds_ativo, vati_ds_ativo, dt_update, trunc(SYSDATE))
            WHERE
                id_ativo = vati_id_ativo;

            IF SQL%rowcount = 0 THEN
                INSERT INTO trade_ativo (
                    id_ativo,
                    ds_ativo,
                    dt_insert
                ) VALUES (
                    vati_id_ativo,
                    vati_ds_ativo,
                    trunc(SYSDATE)
                );

                v_exception := 'INSERT realizado em TRADE_ATIVO';
            ELSE
                v_exception := 'UPDATE realizado em TRADE_ATIVO';
            END IF;

            UPDATE trade_ativo_contrato
            SET
                dt_emissao = vati_dt_emissao,
                dt_vencimento = vati_dt_vencimento
            WHERE
                id_ativo_contrato = vati_id_ativo_contrato;

            IF SQL%rowcount = 0 THEN
                INSERT INTO trade_ativo_contrato (
                    id_ativo_contrato,
                    dt_emissao,
                    dt_vencimento
                ) VALUES (
                    vati_id_ativo_contrato,
                    vati_dt_emissao,
                    vati_dt_vencimento
                );

                v_exception := 'INSERT realizado em TRADE_ATIVO_CONTRATO';
            ELSE
                v_exception := 'UPDATE realizado em TRADE_ATIVO_CONTRATO';
            END IF;

            UPDATE trade_ativo_result
            SET
                id_centro = vati_id_centro,
                ds_tipo_rtm = vati_qt_saldo_sap,
                codigo_cliente = vvis_codigo_cliente,
                id_grupo_cliente = vati_id_grupo_cliente,
                ds_grupo_cliente = vati_ds_grupo_cliente,
                status = DECODE(vati_qt_saldo_coleta, vati_qt_saldo_sap, 'Não', 'Sim'),
                qt_saldo_sap = vati_qt_saldo_sap,
                qt_saldo_coleta = vati_qt_saldo_coleta,
                id_ativo_motivo = DECODE(vati_id_ativo_motivo, 0, NULL),
                ds_observacao = vati_ds_observacao,
                id_ativo_contrato = vati_id_ativo_contrato,
                id_canal_distribuicao = vati_id_canal_distribuicao,
                id_setor_atividade = vati_id_setor_atividade,
                id_modulo = vvis_id_modulo
            WHERE
                id_visita = vati_id_visita
                AND id_ativo = vati_id_ativo
                AND matricula = vvis_matricula
                AND dt_coleta = vvis_dt_coleta;

            IF SQL%rowcount = 0 THEN
                INSERT INTO trade_ativo_result (
                    id_visita,
                    id_centro,
                    id_ativo,
                    ds_tipo_rtm,
                    codigo_cliente,
                    id_grupo_cliente,
                    ds_grupo_cliente,
                    status,
                    dt_coleta,
                    qt_saldo_sap,
                    qt_saldo_coleta,
                    matricula,
                    id_ativo_motivo,
                    ds_observacao,
                    id_ativo_contrato,
                    id_canal_distribuicao,
                    id_setor_atividade,
                    id_modulo
                ) VALUES (
                    vati_id_visita,
                    vati_id_centro,
                    vati_id_ativo,
                    vati_qt_saldo_sap,
                    vvis_codigo_cliente,
                    vati_id_grupo_cliente,
                    vati_ds_grupo_cliente,
                    DECODE(vati_qt_saldo_coleta, vati_qt_saldo_sap, 'Não', 'Sim'),
                    vvis_dt_coleta,
                    vati_qt_saldo_sap,
                    vati_qt_saldo_coleta,
                    vvis_matricula,
                    DECODE(vati_id_ativo_motivo, 0, NULL),
                    vati_ds_observacao,
                    vati_id_ativo_contrato,
                    vati_id_canal_distribuicao,
                    vati_id_setor_atividade,
                    vvis_id_modulo
                );

                v_exception := 'INSERT realizado em TRADE_ATIVO_RESULT';
            ELSE
                v_exception := 'UPDATE realizado em TRADE_ATIVO_RESULT';
            END IF;

        END LOOP;

        COMMIT;
        p_result := '1';--'Procedimento realizado com sucesso!';
    ELSE
        p_result := 'Não é JSON.';
    END IF;

EXCEPTION
    WHEN OTHERS THEN
        p_result := 'Procedimento obteve sucesso até: '
                    || v_exception
                    || ', mas obteve erro: '
                    || sqlerrm
                    || ', ao executar: '
                    || sqlcode;

        ROLLBACK;
        INSERT INTO trade_log_procedures (
            json,
            log,
            procedure_executada
        ) VALUES (
            p_clob,
            p_result,
            'PRC_GRAVA_VISITA'
        );

        COMMIT;
END;
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Pelo que eu estou vendo, a forma que ele usa pra saber se deve inserir é se caso o UPDATE afetou zero linhas.
Exemplo: (possui várias vezes isso)

Selecionar tudo

           UPDATE trade_ativo_contrato
            SET
                dt_emissao = vati_dt_emissao,
                dt_vencimento = vati_dt_vencimento
            WHERE
                id_ativo_contrato = vati_id_ativo_contrato;

            IF SQL%rowcount = 0 THEN
                INSERT INTO trade_ativo_contrato (
                    id_ativo_contrato,
                    dt_emissao,
                    dt_vencimento
                ) VALUES (
                    vati_id_ativo_contrato,
                    vati_dt_emissao,
                    vati_dt_vencimento
                );
Eu daria uma atenção nesses UPDATES aí pra saber se estão corretos.
Pelo que visto, o UPDATE está alterando ZERO linhas, causando o INSERT posteriormente.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 23 visitantes