说说PL/SQL一个比较冷门但是很强大的东西——条件编译,顾名思义,条件编译就是根据不同的条件编译PL/SQL应用而无需移除源码中的文本。比如,根据不同的数据库版本,编译不同的源码;在开发环境中用于debug的语句,当在生产环境部署时不编译该部分语句。
预处理控制指令
预处理控制指令的基本模式为$plsql_identitier
,用于在PL/SQL编译之前处理PL/SQL源码。其指令如下:
- $IF
- $THEN
- $ELSE
- $ELIF
- $ERROR
通过这些指令我们就可以完成编译的选择以及错误指令,基本语法如下:
$IF boolean_static_expression $THEN
text
[ $ELSIF boolean_static_expression $THEN
text
$ERROR 'unsupported database release' $END
]...
[ $ELSE
text
$END
]
查询指令
既然是条件编译,那么很关键的一点就是如何获取编译环境的信息,这就是查询指令的作用。
预定义查询指令
查询指令的基本语法为:$$name
。预定义的name
如下:
* PLSQL_LINE:值为其出现的PL/SQL单元的行数。
* PLSQL_UNIT:值为该PL/SQL单元的名字。
* PLSQL_UNIT_OWNER:值为该编译单元所属用户,对于匿名PL/SQL块,值为NULL。
* PLSQL_UNIT_TYPE:值为该PL/SQL单元的类型,ANONYMOUS BLOCK, FUNCTION, PACKAGE, PACKAGE BODY, PROCEDURE, TRIGGER, TYPE, 或者 TYPE BODY。
* plsql_compilation_parameter: PL/SQL编译参数,PLSCOPE_SETTINGS、PLSQL_CCFLAGS、PLSQL_CODE_TYPE、PLSQL_OPTIMIZE_LEVEL等。
需要注意的是查询指令只能与NULL进行比较。下面是一个简单的示例:
SQL> CREATE OR REPLACE PROCEDURE p IS
2 i PLS_INTEGER;
3 BEGIN
4 i := $$PLSQL_LINE;
5 DBMS_OUTPUT.PUT_LINE('i = '