Oracle 19c未引入全新简化语法,而是通过%type/%rowtype避免硬编码类型、CREATE OR REPLACE PROCEDURE省去手动删除、SET SERVEROUTPUT ON启用调试输出、精准捕获预定义异常等实践提升开发效率与健壮性。
oracle 19c 并没有引入“全新简化语法”来替代传统 pl/sql 存储过程结构,所谓“简化”实际是合理利用已有特性减少冗余、规避常见错误,而非语法糖式的重构。
用 %type 和 %rowtype 避免硬编码类型声明
手动写 VARCHAR2(10) 或 NUMBER(8,2) 容易和表结构脱节,一旦字段长度变更,存储过程编译失败或截断数据。
- 用
emp.ename%type替代VARCHAR2(10):类型和长度自动同步表定义 - 用
emp%rowtype替代逐个声明字段变量:尤其适合SELECT ... INTO场景 - 注意:
%type只能用于单列,%rowtype对应整行;两者都不能在包规范(PACKAGE)的声明部分直接用作参数类型
示例:
BEGIN
DECLARE
v_name emp.ename%type;
v_rec emp%rowtype;
BEGIN
SELECT * INTO v_rec FROM emp WHERE empno = 7369;
v_name := v_rec.ename;
END;
END;
用 CREATE OR REPLACE PROCEDURE 省去手动删除再创建
开发调试阶段反复改存储过程时,不加 OR REPLACE 会报 ORA-00955: name is already used by an existing object,必须先 DROP PROCEDURE 再重建,容易遗漏权限或依赖项。
- 始终使用
CREATE OR REPLACE PROCEDURE,覆盖旧版本,保留原有执行权限 - 但注意:替换后,调用方缓存的依赖关系不会自动刷新,若涉及表结构变更,可能需手动
ALTER PROCEDURE ... COMPILE - 不要依赖
OR REPLACE掩盖逻辑错误——它不校验参数兼容性,比如把IN改成OUT不报错,但调用会失败
用 DBMS_OUTPUT.PUT_LINE 调试前必须 SET SERVEROUTPUT ON
很多新手写了 DBMS_OUTPUT.PUT_LINE 却看不到输出,以为代码没运行,其实是客户端未开启缓冲区捕获。
- 在 SQL*Plus 或 SQL Developer 的脚本开头加
SET SERVEROUTPUT ON(不是 PL/SQL 块内) - SQL Developer 图形界面默认关闭该开关,需在菜单
View → DBMS Output打开面板,再点击绿色 “+” 连接当前会话 -
DBMS_OUTPUT是调试工具,非日志机制,生产环境不应依赖它做关键状态记录
异常处理别只写 WHEN OTHERS
全兜底的 WHEN OTHERS THEN NULL 或仅打印 SQLERRM 会让问题难以定位,比如约束冲突、空值插入、游标未打开等都混在一起。
- 优先捕获预定义异常:
NO_DATA_FOUND、TOO_MANY_ROWS、DUP_VAL_ON_INDEX - 用
SQLCODE和SQLERRM记录完整错误上下文,至少包含过程名和输入参数值 - 避免在事务中静默吞掉异常——没
ROLLBACK就可能留下脏数据
真正省事的方式,是让错误暴露得早、准、可追溯,而不是靠语法“简化”绕过问题。











