PRAGMA INLINE 是 Oracle 的编译器提示指令,仅对包体中定义的子程序生效,必须紧贴声明、位于 BEGIN 前且无空行或注释;函数名不加引号,'YES' 必须带单引号;不适用于匿名块、SQL 调用及外部调用;内联效果有限,需通过 DBMS_PREPROCESSOR 验证是否生效。

不能“强制”内联,PRAGMA INLINE 只是建议,且仅对包体中定义的子程序生效;写错位置或格式,它就完全被忽略。
PRAGMA INLINE 必须紧贴子程序声明,且位置不能错
Oracle 的 PRAGMA INLINE 不是开关,而是编译器提示指令,必须严格满足位置和语法要求:
- 必须写在子程序(过程或函数)的 声明之后、BEGIN 之前,且中间不能有空行或注释隔开
- 正确写法:
PRAGMA INLINE(calc_bonus, 'YES');—— 函数名不加引号,第二个参数字符串必须带单引号 - 常见错误:
PRAGMA INLINE('calc_bonus', 'YES')(函数名误加引号)、PRAGMA INLINE(calc_bonus, YES)('YES' 缺引号)、写在BEGIN后面 - 若子程序在包中,
PRAGMA INLINE必须放在 包体(BODY) 对应子程序声明处,包规范(SPEC)里写无效
只对包体中的子程序起作用,匿名块和SQL调用无效
PRAGMA INLINE 在 Oracle 中仅影响 PL/SQL 子程序之间的调用优化,不适用于:
- 匿名 PL/SQL 块(如
DECLARE ... BEGIN ... END;)中定义的本地子程序 —— 无法加 pragma - SQL 语句中调用的函数(如
SELECT my_func(x) FROM t)—— pragma 对 SQL 层无影响 - 外部调用(如 JDBC 调用存储过程)—— pragma 仅作用于 PL/SQL 执行引擎内部
- 跨包调用:即使 A 包调用了 B 包的函数,B 包体中对该函数加的 pragma 仅影响 B 包内部调用,不影响 A 包调用点
内联收益有限,别高估它的实际效果
即使 pragma 生效,也不等于性能明显提升:
- 内联后函数体被复制到每个调用点,可能增大 PGA 使用量,尤其当函数含大局部变量或游标时
- 若函数本身含
SELECT ... INTO、DBMS_OUTPUT或异常处理块,Oracle 编译器大概率会忽略内联建议 - 实测中,多数业务逻辑函数(含 IO、SQL、条件分支)内联后执行时间差异在 ±5% 内,远不如优化 SQL 或索引见效
- 真正受益的场景极窄:纯计算型、无副作用、调用频次极高(如循环内千次以上)、且函数体小于 10 行的简单逻辑
最容易被忽略的一点:pragma 生效与否,Oracle 不报错也不警告,你得靠 DBMS_PREPROCESSOR 或查看 ALL_SOURCE 编译后的代码结构来间接验证,否则永远不知道它有没有起作用。











