PL/SQL单元包括匿名块(PL/SQL anonymous block)、函数(FUNCTION)、包(PACKAGE)、包体(PACKAGE BODY)、过程(PROCEDURE)、触发器(TRIGGER)、类型(TYPE)、类型体(TYPE BODY)。PL/SQL单元受PL/SQL编译参数的影响,编译参数为数据库初始化参数。
编译参数有如下几类,如表1.1所示。
表1.1 PL/SQL编译参数列表
在一个PL/SQL语句块中的SQL语句可以引用块中的变量和参数,当变量名、参数名与表的列名重名时,这条语句就会产生歧义。要解决变量名的冲突问题,则需要限定引用的变量,或者配置变量冲突时的策略。
示例1.4: 依赖于VARIABLE_CONFLICT设置的函数。
示例函数中含有2个参数,shopid和shopname,而shopstores表中也含有同名的2列。由于设置了编译参数VARIABLE_CONFLICT为use_variable,所以在UPDATE命令中shopname和shopid引用的是函数中的变量,而非shopstores表中的列。如果需要引用表中的列,则需要在相应名称前添加表名加以限定,如WHERE子句中的shopstores.shopid。
如果要在系统范围内更改这一行为,需修改配置参数plsql.variable_conflict,设置为error、use_variable、use_column之一。
还可以通过在过程开头插入以下的特殊命令之一单独设置行为,代码如下。
示例1.5: 不依赖于VARIABLE_CONFLICT设置的函数。
程序代码如下。
assert断言语句主要用于调试,以便检查PL/SQL程序设计是否与预期一致。assert语句的语法格式如下。
在该语句中,condition是一个布尔表达式,预期总是返回true。如果condition结果为true,则assert语句不执行任何操作;如果结果为false或null,则会引发assert_failure异常。
通过配置参数plsql.check_asserts可以启用或者禁用断言测试。该参数接受布尔值,且默认为on。如果为off,则assert语句什么也不做。
在PL/SQL中,创建一个引用了不存在对象的语句块,该语句块可以正常创建,在被引用的对象补充创建之后,语句块即可正常调用;如果调用时被引用的对象仍不存在,则会抛出异常。
如果希望在创建语句块时就对引用对象的有效性进行检查,则可以通过设置plsql.compile_checks参数为true编译检查功能的启用。
示例1.6: 关闭编译检查功能,创建引用不存在对象的语句块。
程序代码如下。
该过程可以正常创建,调用时会抛出异常,程序代码如下。
示例1.7: 开启编译检查功能,创建引用不存在对象的语句块。
程序代码如下。
此时,创建过程会提示相关引用对象不存在,程序代码如下。