PL/SQL Conditional Compilation

该特性与C语言的类似。从Oracle 9.2.0.6开始被引入,9.2.0.6默认关闭该特性,可以通过一个参数打开。10gR1默认是打开,可以关闭。10gR2或以上默认打开,不可以关闭。常用于以下场景:

  • 代码使用Oracle某新特性实现某个需求;为了兼容老版本Oracle,需要用另一个方法实现。在编译时,可以针对Oracle版本,选择性的编译。
  • 在开发时,打开Tracing, 生产服务器上关闭Tracing。

Conditional Compilation有三种元素:

Selective Directives:

$IF $THEN $ELSEIF $ELSE $END

Inquiry Directives: 用$$引用

NLS_Length_Semantics

PLSQL_Optimize_Level: 0-3. 11gR2, 默认2. 1: PL/SQL 优化器基本不改变代码。0: 不改变代码,同时将代码中BINARY_INTEGER和PLS_INTEGER替换为效率稍低的类型。10g+Oracle使用这个级别会有性能损失。

PLSQL_Code_Type

PLSQL_Debug:deprecated.

PLSQL_Warnings: 11gR2默认'DISABLE:ALL', 表示忽略所有Warning信息。  

alter session set plsql_warnings='ENABLE:SEVERE'
 将severe信息作为Warning。
alter session set plsql_warnings='ENABLE:INFORMATIONAL'
alter system set plsql_warnings='enable:performance', 'enable:severe';
PLSQL_CCFLAGS 。码农可以用PLSQL_CCFLAGS自定义一些控制参数,如:ALTER SESSION SET PLSQL_CCFLAGS = 'debug:TRUE'

PLSQL_UNIT: 当前代码段
PLSQL_LINE:代码行

Error Directives: $ERROR,指令预编译器报错。

两个辅助PL/SQL包

DBMS_DB_VERSION

DBMS_PREPROCESSOR:用户可以看到预编译完毕的代码

例子1: 使用$error编译时报错

begin
$if true $then
  $error 'Error: Go to ' || $$plsql_unit || ' at line ' || $$plsql_line
$end
end;
例子2:$error 结合plsql_ccflags

ALTER SESSION SET PLSQL_CCFLAGS = 'current_user_type:0'
CREATE OR REPLACE PACKAGE user_types
IS
   administrator CONSTANT PLS_INTEGER := 1;
   enduser CONSTANT PLS_INTEGER := 2;
END user_types;
   
CREATE OR REPLACE PROCEDURE show_info
IS
BEGIN
  $IF $$current_user_type = user_types.administrator 
  $THEN
     DBMS_OUTPUT.PUT_LINE ('Administrator!');
  $elsif $$current_user_type = user_types.enduser
  $THEN
     DBMS_OUTPUT.PUT_LINE ('End user!');
  $ELSE
     $ERROR 'Current user type of ' || $$current_user_type || ' is not known.' $END
  $END
end show_info;
show errors;
11/6           PLS-00179: $ERROR: Current user type of 0 is not known.
例子3: Oracle数据库版本相关

CREATE OR REPLACE PROCEDURE
crunch_numbers
IS
   n $IF DBMS_DB_VERSION.VER_LE_9_2
     $THEN NUMBER;
     $ELSE BINARY_FLOAT;
     $END
BEGIN
   $IF DBMS_DB_VERSION.VER_LE_9_2
   $THEN n := 1.0;
   $ELSE n := 1.0f;
   $END
   DBMS_OUTPUT.put_line ( n );
END crunch_numbers;

例子4: DEV环境,打开Tracing


alter session set plsql_ccflags = 'tracing:true';
create or replace procedure p1
as
begin
  $if $$tracing = true $then
    dbms_output.put_line('xx');
  $end
  null;
end;
本文部分例子借鉴了Oracle Magazine

http://www.oracle.com/technetwork/issue-archive/2006/06-jul/o46plsql-096385.html

DBMS_PREPROCESSOR.print_post_processed_source:

set serveroutput on;
exec DBMS_PREPROCESSOR.PRINT_POST_PROCESSED_SOURCE('PROCEDURE',NULL, UPPER('crunch_numbers'));


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值