银行数仓之存储过程小案例

简单的案例

从多个表获取客户交易数据,进行数据清洗、计算和汇总,并将结果存储到目标表中

CREATE OR REPLACE PROCEDURE bank_data_warehouse_processing
IS
    -- 定义游标获取源表数据
    CURSOR source_data_cur IS
        SELECT customer_id, transaction_amount, transaction_date
        FROM source_transactions;

    -- 定义变量存储计算和汇总结果
    total_amount NUMBER := 0;
    average_amount NUMBER := 0;
    transaction_count NUMBER := 0;

    -- 定义异常处理
    invalid_data EXCEPTION;

BEGIN
    FOR source_data_rec IN source_data_cur
    LOOP
        -- 数据清洗和验证
        IF source_data_rec.transaction_amount < 0 THEN
            RAISE invalid_data;
        END IF;

        -- 数据计算和汇总
        total_amount := total_amount + source_data_rec.transaction_amount;
        transaction_count := transaction_count + 1;

    END LOOP;

    -- 计算平均值
    average_amount := total_amount / transaction_count;

    -- 将结果插入到目标表
    INSERT INTO target_table (customer_id, total_amount, average_amount, transaction_count)
    VALUES (source_data_rec.customer_id, total_amount, average_amount, transaction_count);

    -- 提交事务
    COMMIT;

EXCEPTION
    WHEN invalid_data THEN
        -- 记录错误日志
        INSERT INTO error_table (error_message, error_time)
        VALUES ('Invalid transaction amount found.', SYSDATE);
        ROLLBACK;
    WHEN OTHERS THEN
        -- 记录其他错误日志
        INSERT INTO error_table (error_message, error_time)
        VALUES ('Unknown error occurred.', SYSDATE);
        ROLLBACK;
END;

在 Oracle 中,RAISE invalid_data; 是用于手动触发一个自定义的异常 invalid_data 。当满足特定的条件(在上述示例中,是当交易金额小于 0 时),通过 RAISE 语句来抛出这个自定义异常,从而执行异常处理部分的代码

VALUES ('Invalid transaction amount found.', SYSDATE) 这里指定了要插入的值,'Invalid transaction amount found.' 是错误消息的文本内容,SYSDATE 是 Oracle 中的内置函数,会获取当前的系统日期和时间作为插入的值。ROLLBACK 用于回滚当前事务,撤销在此事务中进行的所有未提交的更改,将数据库状态恢复到事务开始之前。综合起来,当触发了自定义的 invalid_data 异常时,会将错误消息和当前时间插入到错误表中,并回滚当前事务。

触发器和存储器连用的案例

存储过程:

CREATE OR REPLACE PROCEDURE calculate_customer_transaction_summary
IS
    -- 定义游标获取客户信息及交易数据
    CURSOR customer_transaction_cur IS
        SELECT c.customer_id, c.name, SUM(t.amount) AS total_amount, AVG(t.amount) AS average_amount
        FROM customers c
        JOIN transactions t ON c.customer_id = t.customer_id
        GROUP BY c.customer_id, c.name;

    -- 定义变量存储操作结果
    v_update_count NUMBER := 0;
BEGIN
    FOR cur_rec IN customer_transaction_cur
    LOOP
        -- 更新客户余额表
        UPDATE customer_balances cb
        SET total_transaction_amount = cur_rec.total_amount,
            average_transaction_amount = cur_rec.average_amount
        WHERE cb.customer_id = cur_rec.customer_id;

        v_update_count := v_update_count + SQL%ROWCOUNT;
    END LOOP;

    -- 输出操作结果
    DBMS_OUTPUT.PUT_LINE('Updated '| v_update_count ||' customer balance records.');
EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('Error occurred: '| SQLERRM);
END;

触发器:

CREATE OR REPLACE TRIGGER give_vip_discount
AFTER INSERT ON transactions
FOR EACH ROW
DECLARE
    v_customer_status VARCHAR2(20);
BEGIN
    -- 获取客户状态
    SELECT status INTO v_customer_status
    FROM customers
    WHERE customer_id = :NEW.customer_id;

    -- 如果是 VIP 客户,给予优惠
    IF v_customer_status = 'VIP' THEN
        :NEW.amount := :NEW.amount * 0.9;  -- 给予 10% 的优惠
    END IF;
END;

存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行。 存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数、输出参数、返回单个或多个结果集以及返回值。 由于存储过程在创建时即在数据库服务器上进行了编译并存储在数据库中,所以存储过程运行要比单个的SQL语句块要快。同时由于在调用时只需用提供存储过程名和必要的参数信息,所以在一定程度上也可以减少网络流量、简单网络负担。 1、 存储过程的优点 A、 存储过程允许标准组件式编程 存储过程创建后可以在程序中被多次调用执行,而不必重新编写存储过程SQL语句。而且数据库专业人员可以随时对存储过程进行修改,但对应用程序源代码却毫无影响,从而极大的提高了程序的可移植性。 B、 存储过程能够实现较快的执行速度 如果某一操作包含大量的T-SQL语句代码,分别被多次执行,那么存储过程要比批处理的执行速度快得多。因为存储过程是预编译的,在首次运行一个存储过程时,查询优化器对其进行分析、优化,并给出最终被存在系统表中的存储计划。而批处理的T-SQL语句每次运行都需要预编译和优化,所以速度就要慢一些。 C、 存储过程减轻网络流量 对于同一个针对数据库对象的操作,如果这一操作所涉及到的T-SQL语句被组织成一存储过程,那么当在客户机上调用该存储过程时,网络中传递的只是该调用语句,否则将会是多条SQL语句。从而减轻了网络流量,降低了网络负载。 D、 存储过程可被作为一种安全机制来充分利用 系统管理员可以对执行的某一个存储过程进行权限限制,从而能够实现对某些数据访问的限制,避免非授权用户对数据的访问,保证数据的安全。
电商数仓存储过程是指将数据从源系统提取、清洗、转换和加载到数仓中的一系列步骤和流程。下面是一个可能的电商数仓存储过程的示例: 1. 数据提取(Extract): - 确定需要收集的数据源,如交易系统、用户行为系统、CRM系统等。 - 设计数据提取方案,选择合适的提取工具或开发脚本。 - 从数据源中提取所需数据,可以使用增量提取或全量提取方式。 2. 数据清洗与转换(Transform): - 对提取的数据进行清洗,处理缺失值、异常值、重复值等。 - 进行数据转换,将数据转换成适合数仓存储和分析的格式。 - 可以进行数据标准化、格式化、合并等操作,以满足数仓的要求。 3. 数据加载(Load): - 设计数据加载方案,选择适合的加载工具或开发脚本。 - 创建数仓中的表结构和索引。 - 将清洗和转换后的数据加载到数仓中,可以使用批量加载或增量加载方式。 4. 数据校验与质量控制: - 进行数据校验,确保加载的数据准确性和完整性。 - 设计并执行数据质量控制规则,检查数据的一致性和合法性。 - 处理数据质量问题,如数据修正、重复数据处理等。 5. 数据更新与维护: - 根据业务需求,定期或实时更新数据至数仓。 - 管理数据的生命周期,包括数据清理、归档和删除等操作。 - 监控数据变化,及时更新数仓中的数据。 6. 安全性与权限管理: - 确保数仓中的数据安全,采取数据加密、权限控制等措施。 - 设计合适的用户权限管理策略,限制对敏感数据的访问权限。 上述存储过程仅为一个示例,实际的电商数仓存储过程可能因业务需求和技术环境的不同而有所差异。在开发过程中,需要根据具体情况进行调整和优化,并配合合适的工具和技术来实现存储过程的各个环节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值