一个PL/SQL块最多由4个不一样单元组成,只有一个单元是必不可少的。数据库
块头(Header)ide
只有命名块才会有这个单元。块头单元就肯定了这个命名块或者程序的调用方式,事件
这个单元是可选的。字符串
声明单元(Declaration section)it
这部分定义变量,游标,以及能够被后面的执行单元或异常处理单元引用的子块。io
这一单元也是可选的。编译
执行单元(Execution section)class
这部分包含了PL/SQL引擎在运行时要执行的语句,这个单元是必须的。变量
异常处理单元select
这部分处理的是正常处理过程当中抛出的异常(根据警告和错误条件),这一单元也是可选的。
匿名块使用场景:
1.数据库触发器
当一特定事件发生时能够出发数据库触发器,然后者能够执行匿名块
2.即席命令或脚本文件
在SQL*Plus环境中,手工输入代码或脚本执行,脚本中调用匿名块。
使用EXECUTE命令。
3.编译后的3GL程序
PL/SQL标示符默认属性:
1.长度最多有30个字符;
2.必须用字母开始;
3.能够带有$,_,#
4.不能带有任何“空白”字符
直接量:只是一个值
数字:
415,21.6,3,141592654f,7D,NULL
字符串
'This is my sentence','01-OCT-1986',q'!hello!',NULL
时间间隔
INTERVAL '25-6' YEAR TO MONTH,INTERVAL '-18' MONTH,NULL
布尔值
TRUE,FALSE,NULL
TO_DATE('01-OCT-1986','DD-MON-YYYY')
TO_TIMESTAMP_TZ('01-OCT-1986 00:00:00 -6','DD-MON-YYYY HH24:MI:SS TZH')
字符串大小写敏感
日期格式敏感
NULL的问题
在PL/SQL中给一个VARCHAR2(n)变量赋值一个长度为0的字符串时,致使的结果就是NULL。
DECLARE
str VARCHAR2(1) := '';
BEGIN
IF str IS NULL THEN --结果是TRUE
DBMS_OUTPUT.PUT_LINE('hello');
END IF;
END;
/
SQL> DECLARE
2 str VARCHAR2(1) := '';
3 BEGIN
4 IF str IS NULL THEN
5 DBMS_OUTPUT.PUT_LINE('hello');
6 END IF;
7 END;
8 /
hello
PL/SQL procedure successfully completed
数据库在处理VARCHAR2类型的表列时也是同样的。
在PL/SQL中给一个CHAR(n)变量赋值一个长度为0的字符串时,数据库会用空格字符填满这个变量,于是这个变量不为空。
DECLARE
flag CHAR(2) := '';
BEGIN
IF flag IS NULL THEN
DBMS_OUTPUT.PUT_LINE('great');
ELSIF flag = ' ' THEN
DBMS_OUTPUT.PUT_LINE('bad');
END IF;
END;
SQL> DECLARE
2 flag CHAR(2) := ''; --用一个长度为零的字符串给CHAR(2)赋值
3 BEGIN
4 IF flag IS NULL THEN --结果是FALSE
5 DBMS_OUTPUT.PUT_LINE('great');
6 ELSIF flag = ' ' THEN --结果是TRUE
7 DBMS_OUTPUT.PUT_LINE('bad');
8 END IF;
9 END;
10 /
bad
PL/SQL procedure successfully completed
这种行为只有在PL/SQL中才能看到。在数据库中,当咱们要向一个CHAR(n)的列插入长度为0的字符串时,数据库不会用空格把列的内容填满,而是NULL。
可见,ORACLE只是部分知足了ANSI 92和ANSI 99的标准,标准要求一个长度为零的字符串和NULL字符串必需要有所区别。
在一个直接量字符串中嵌入单引号
要求显示'hello'字符串,带上单引号。
在ORACLE 10g以前,咱们必须这样作:
SQL> select '''hello''' from dual;
'''HELLO'''
-----------
'hello'
ORACLE 10g引入了自定义的分隔符,用q来标记咱们的分隔符,而后用单引号把分割表达式包围起来。
SQL> select q'['hello']' from dual;
Q'['HELLO']'
------------
'hello'