一个PL/SQL块最多由4个不同单元组成,只有一个单元是必不可少的。


块头(Header)

    只有命名块才会有这个单元。块头单元就确定了这个命名块或者程序的调用方式,

    这个单元是可选的。

    

声明单元(Declaration section)

    这部分定义变量,游标,以及可以被后面的执行单元或异常处理单元引用的子块。

    这一单元也是可选的。

    

执行单元(Execution section)

    这部分包含了PL/SQL引擎在运行时要执行的语句,这个单元是必须的。

    

异常处理单元

    这部分处理的是正常处理过程中抛出的异常(根据警告和错误条件),这一单元也是可选的。

 

匿名块使用场景:

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'