dryu999 发表于 2018-9-10 10:19:17

ORACLE PL/SQL练习(二)

  一个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 NULLTHEN          --结果是TRUE
  DBMS_OUTPUT.PUT_LINE('hello');
  END IF;
  END;
  /
  SQL> DECLARE
  2      str VARCHAR2(1) := '';
  3BEGIN
  4      IF str IS NULLTHEN
  5      DBMS_OUTPUT.PUT_LINE('hello');
  6      END IF;
  7END;
  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)赋值
  3BEGIN
  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;
  9END;
  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'

页: [1]
查看完整版本: ORACLE PL/SQL练习(二)