[firebase-br] Duvidas básica

Gladiston Santana gladiston.santana em gmail.com
Quarta Novembro 12 11:15:15 -03 2025


Voce tem que trabalhar com cursores, open/close, mas apenas ficaria mais
verborrágico, melhor usar cursores usando for/select assim:


EXECUTE BLOCK
RETURNS (
    OUT_ID_CLIENTE_PROCESSADO INTEGER,
    OUT_STATUS_OPERACAO VARCHAR(255)
)
AS
    -- Variáveis locais (mantidas como no exemplo anterior para clareza)
    DECLARE V_CODIGO_CLIENTE     INTEGER;
    DECLARE V_NOME_COMPLETO      VARCHAR(50);
    DECLARE V_DATA_ULTIMA_COMPRA DATE;
    DECLARE V_VALOR_TOTAL_DEBITO NUMERIC(10, 2);
    DECLARE V_CATEGORIA_RISCO    VARCHAR(100);
    DECLARE V_MOTIVO_INATIVACAO  BLOB SUB_TYPE TEXT;

    DECLARE V_DIAS_LIMITE_COMPRA INTEGER = 365;
    DECLARE V_VALOR_MAXIMO_DEBITO NUMERIC(10, 2) = 50.00;
BEGIN
    FOR
        SELECT
            ID_CLIENTE, NOME_CLIENTE, DATA_COMPRA, VALOR_DEBITO,
CLASSIFICACAO_RISCO, DETALHE_INATIVACAO
        FROM
            CLIENTES
    INTO
        V_CODIGO_CLIENTE, V_NOME_COMPLETO, V_DATA_ULTIMA_COMPRA,
V_VALOR_TOTAL_DEBITO, V_CATEGORIA_RISCO, V_MOTIVO_INATIVACAO
    DO
    BEGIN
        -- Lógica da Condição de Deleção
        IF (DATEADD(DAY, V_DIAS_LIMITE_COMPRA, V_DATA_ULTIMA_COMPRA) <
CURRENT_DATE
            AND V_VALOR_TOTAL_DEBITO > V_VALOR_MAXIMO_DEBITO
            AND V_CATEGORIA_RISCO = 'ALTO')
        THEN
        BEGIN
            -- Execução do DELETE
            DELETE FROM CLIENTES
            WHERE ID_CLIENTE = V_CODIGO_CLIENTE;

            -- Saída de Auditoria/Log (COM ID na mensagem)
            OUT_ID_CLIENTE_PROCESSADO = V_CODIGO_CLIENTE;
            OUT_STATUS_OPERACAO = 'DELETADO: Cliente ID ' ||
CAST(V_CODIGO_CLIENTE AS VARCHAR(10)) || ' - Inativo por Risco.';
            SUSPEND;
        END
        ELSE
        BEGIN
            -- Saída de Auditoria/Log (COM ID na mensagem)
            OUT_ID_CLIENTE_PROCESSADO = V_CODIGO_CLIENTE;
            OUT_STATUS_OPERACAO = 'MANTIDO: Cliente ID ' ||
CAST(V_CODIGO_CLIENTE AS VARCHAR(10)) || ' - Critério de exclusão não
atendido.';
            SUSPEND;
        END
    END
END

Ao inves de excluir, voce pode acrescentar uma coluna para marcar para
exclusão, e depois usar essa coluna para fazer um pente fino para desmarcar
falsos positivos. Excluir diretamente numa tacada só, não tem volta. Veja
se sua tabela tem ER (Integridade referencial), excluir um cliente e depois
sumir todos os pedidos, não será agradável de explcar depois.


Mais detalhes sobre a lista de discussão lista