当前位置: 首页 > news >正文

(课堂笔记)PL/SQL:异常处理、数据同步、日志

PL/SQL 异常处理与数据同步要点

  1. 异常处理:使用EXCEPTION捕获错误,SQLERRM获取错误信息,结合ROLLBACK回滚事务,确保数据一致性。

  2. 数据同步

    • 全量同步:清空目标表后插入源表数据。
    • 增量同步:通过MERGE语句按主键比对更新或插入数据,高效处理增量变更。
  3. 日志记录:记录程序运行状态(步骤、时间、数据量等),异常时保存错误信息,便于排查问题。

  4. 关键语法

    • TRUNCATE快速清表
    • SQL%ROWCOUNT获取影响行数
    • COMMIT/ROLLBACK控制事务

适用于ETL、数据迁移等场景,确保数据同步的可靠性和可追溯性。

PL/SQL:异常处理补充


数据源表到目标表的数据同步,注意事项或规则有哪些


📘 PL/SQL 课堂笔记


一、异常处理(Exception Handling)


🎯 使用场景

  • 程序可能出现意外错误时,根据异常决定:继续运行、中断程序、提取错误信息等。

📝 语法结构

sql

EXCEPTION WHEN 异常场景 THEN 处理动作;
  • OTHERS:捕获所有未明确指定的异常

🔧 关键内置变量

  • SQLERRM:返回当前异常的完整错误信息

📌 示例1:捕获异常并显示信息

sql

EXCEPTION WHEN OTHERS THEN V_STR := SQLERRM; DBMS_OUTPUT.PUT_LINE('异常信息:' || V_STR);

📌 示例2:带事务控制的异常处理

sql

EXCEPTION WHEN OTHERS THEN ROLLBACK; -- 回滚DML操作 RAISE; -- 重新抛出异常,中断程序

✅ 工作中常用模式

sql

EXCEPTION WHEN OTHERS THEN ROLLBACK; INSERT INTO 日志表 VALUES (SQLERRM); COMMIT;

二、数据同步(Data Synchronization)

🧠 定义

将 A 表数据经过加工后写入 B 表的过程。

📌 全量同步

  • 步骤:清空目标表 → 插入全部源表数据

  • 特点:每次调用后数据为最新快照

sql

EXECUTE IMMEDIATE 'TRUNCATE TABLE 目标表'; INSERT INTO 目标表 SELECT * FROM 源表;

📌 增量同步

方式1:按时间段增量(如按年)
  • 先删除目标表中该时间段数据

  • 再插入源表中该时间段数据

sql

DELETE FROM 目标表 WHERE TO_CHAR(HIREDATE,'YYYY') = 年份; INSERT INTO 目标表 SELECT * FROM 源表 WHERE ...;
方式2:主键比对(MERGE)
  • 用于源表数据可能更新或新增的场景

MERGE 语法模板

sql

MERGE INTO 目标表 M USING (SELECT * FROM 源表) N ON (M.主键 = N.主键) WHEN MATCHED THEN UPDATE SET ... WHEN NOT MATCHED THEN INSERT ...
  • MATCHED:更新已有记录

  • NOT MATCHED:插入新记录


完整示例
--示例:用 EMP 表的数据 插入更新到 EMP_0508 CREATE OR REPLACE PROCEDURE P_033 IS BEGIN MERGE INTO EMP_0508 M USING (SELECT * FROM EMP) N ON (M.EMPNO = N.EMPNO) WHEN MATCHED THEN UPDATE SET M.ENAME = N.ENAME, M.JOB = N.JOB, M.MGR = N.MGR, M.HIREDATE = N.HIREDATE, M.SAL = N.SAL, M.COMM = N.COMM, M.DEPTNO = N.DEPTNO WHEN NOT MATCHED THEN INSERT (M.EMPNO,M.ENAME,M.JOB,M.MGR,M.HIREDATE,M.SAL,M.COMM,M.DEPTNO) VALUES (N.EMPNO,N.ENAME,N.JOB,N.MGR,N.HIREDATE,N.SAL,N.COMM,N.DEPTNO); COMMIT; END; --调用 BEGIN P_033; END; --验证 SELECT * FROM EMP_0508;

三、日志记录(Logging)

🎯 目的

记录程序运行状态(步骤、时间、数据量、异常等),便于调试和调优。

🗃️ 日志表示例

sql

CREATE TABLE T_LOG ( PRO_NAME VARCHAR2(100), -- 程序名 STEP_NAME VARCHAR2(100), -- 步骤名 START_TIME DATE, -- 开始时间 END_TIME DATE, -- 结束时间 CNT NUMBER, -- 处理行数 STATUS VARCHAR2(100), -- 状态(Success/Error) MARK VARCHAR2(100) -- 备注/错误信息 );

📌 典型日志记录流程

  1. 记录程序名、步骤名、开始时间

  2. 执行业务逻辑

  3. 记录结束时间、处理行数、状态

  4. 异常时回滚并记录错误信息

sql

STEP_NAME := '同步数据'; START_TIME := SYSDATE; -- 业务操作 V_CNT := SQL%ROWCOUNT; STATUS := 'Success'; END_TIME := SYSDATE; INSERT INTO T_LOG VALUES (...);

⚠️ 异常块中的日志

sql

EXCEPTION WHEN OTHERS THEN ROLLBACK; MARK := SQLERRM; INSERT INTO T_LOG VALUES (...); COMMIT;

完整示例
--开发存储过程 并记录日志信息 CREATE OR REPLACE PROCEDURE P_034 IS PRO_NAME VARCHAR2(100) := 'P_034'; -- 记录程序的名称 STEP_NAME VARCHAR2(100); -- 用于接收程序的步骤名 START_TIME DATE; -- 用于接收步骤的开始时间 END_TIME DATE; --用于接收步骤的结束时间 STATUS VARCHAR2(100) := 'Error'; -- 用于记录步骤执行状态 V_CNT NUMBER; -- 用于接收总共处理了多少行数据 MARK VARCHAR2(100); -- 作为一个备注项 BEGIN EXECUTE IMMEDIATE 'TRUNCATE TABLE EMP_0508'; STEP_NAME := '同步数据 EMP 到 EMP_0508'; START_TIME := SYSDATE; INSERT INTO EMP_0508 SELECT EMPNO,ENAME,JOB,MGR,HIREDATE, SAL / 0 AS SAL,COMM,DEPTNO FROM EMP; V_CNT := SQL%ROWCOUNT; COMMIT; STATUS := 'Success'; END_TIME := SYSDATE; MARK := '程序执行成功了!'; INSERT INTO T_LOG VALUES (PRO_NAME,STEP_NAME,START_TIME,END_TIME,V_CNT,STATUS, MARK); COMMIT; EXCEPTION WHEN OTHERS THEN ROLLBACK; MARK := SQLERRM; INSERT INTO T_LOG VALUES (PRO_NAME,STEP_NAME,START_TIME,END_TIME,V_CNT,STATUS, MARK); COMMIT; END; --调用: BEGIN P_034; END; --验证 SELECT * FROM EMP_0508;-- 数据同步过来了 SELECT * FROM T_LOG;

四、关键点速记表

概念关键字 / 语法说明
异常信息获取SQLERRM返回错误文本
捕获所有异常WHEN OTHERS THEN异常处理兜底
事务回滚ROLLBACK撤销DML操作
事务提交COMMIT确认DML操作
清空表TRUNCATE(需动态SQL)快速清表,不可回滚
获取影响行数SQL%ROWCOUNT最近一条DML影响的行数
主键比对同步MERGE ... WHEN MATCHED / NOT MATCHED增量更新+插入
http://www.jsqmd.com/news/786409/

相关文章:

  • 通用人工智能系统(GPAIS)架构、挑战与可信治理实践
  • 百度用6%成本碾压硅谷?中国AI把性价比玩明白了
  • 八个程序员常用的接单平台推荐
  • CANN/ops-cv AICPU加法算子示例
  • 年轻人用 AI 完成情绪自救:从发疯吐槽到平行宇宙重养自己
  • 【OpenClaw从入门到精通】第77篇:Token经济学实战——从月耗1200到200元,AI数字员工成本优化全攻略(2026万字实战版)
  • 基于OpenClaw的小红书自动化运营插件auto-rednote实战指南
  • Discord音频桥接技术:实时语音流处理与下游应用集成指南
  • taotoken的api key管理与访问控制功能实际使用感受分享
  • 单细胞与空间转录组分析技能栈构建:从环境搭建到AI协作实战
  • 2026 年了,国产大模型和 GPT/Claude的差距还有多大?
  • ACL 2025 最佳论文解读:《Language Models Resist Alignment: Evidence From Data Compression》
  • RimSort终极指南:如何用开源工具彻底解决环世界MOD管理难题
  • 房子装修完多久可以入住?安全标准与通风时长全解析
  • 会议记录工具评测对比解析,AI识别整理技术的实际优势
  • 半导体光刻中SRAF与逆光刻技术的应用与优化
  • 第十章 供水管网水力模型的工程管理
  • MagiskBoot深度解析:Android启动镜像定制终极指南与实战技巧
  • LLMCompiler:大语言模型并行函数调用编译器原理与实践
  • 谷歌Gmail客户端升级:新增AI Inbox入口,‘Help me write’功能深度进化
  • 工厂设计模式(Factory Pattern):工厂方法与抽象工厂的实例演示
  • CANN盘古7B配置说明
  • 一键提取视频PPT:开源智能视频内容自动化提取的革命性工具
  • 平滑滚动技术:从原理到实现,打造丝滑交互体验
  • ARM64缓存维护指令DC CVAC详解与应用
  • 5G R18标准:AI/ML如何重塑空口优化与网络架构
  • 终极Blender插件:快速解决虚幻引擎PSK/PSA格式转换难题
  • 3PEAK思瑞浦 TP2264-TS2R-S TSSOP14 运算放大器
  • 多模态大模型Awesome列表:从资源导航到高效学习与开发实践
  • 保姆级 Kali Linux 安装教程|零基础小白也能看懂,从镜像下载到虚拟机配置全程图文详解,零报错上手