`
Copperfield
  • 浏览: 255237 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
C407adc3-512e-3a03-a056-ce4607c3a3c0
java并发编程陷阱
浏览量:24687
社区版块
存档分类

第二章 PL/SQL基础

阅读更多

第二章 PL/SQL基础

我们可以使用标识符来为PL/SQL程序中的常量、变量、异常、游标、游标变量、子程序和包命名。

标识符可以由字母、数字、美元符号($)、下划线(_)和数字符号(#)组成。而像连字符(-)、斜线(/)等符号都是不允许使用的。标识符的长度不能超过30如下例:

mine&yours -- 不允许使用连字符(not allowed because of ampersand)

debit-amount -- 不允许使用连字符(not allowed because of hyphen)

on/off -- 不允许使用斜线(not allowed because of slash)

user id -- 不允许使用空格(not allowed because of space)

而使用美元符号、下划线和数字符号都是允许的:

money$$$tree

SN##

try_again_

如果字符文字的范围不在1E-13010E125之间,就会产生编译错误:

DECLARE
  n NUMBER;
BEGIN
  n := 10E127;   -- causes a 'numeric overflow or underflow' error

 


我们可以使用关键字DEFAULT来替换赋值操作符为变量初始化。下面这个声明

blood_type   CHAR := 'o';

就可以用DEFAULT来替换:

blood_type   CHAR DEFAULT 'o';

我们可以使用DEFAULT来初始化子程序参数、游标参数和用户定义的记录中的域。

 

除了在声明中做初始化操作外,还可以使用NOT NULL进行约束:

acct_id INTEGER(4) NOT NULL := 9999; 

这样一来,我们就不能为变量acct_id指派空值了。如果这样做的话,PL/SQL就会抛出预定义异常VALUE_ERRORNOT NULL约束后面必须跟着初始化子句。像下面这样的声明是不允许的:

acct_id INTEGER(5) NOT NULL;   -- not allowed; not initialized 

NATURALNPOSITIVENPL/SQL提供的两个不可为空的预定义子数据类型。下面这两个声明是等价的:

emp_count NATURAL NOT NULL := 0;

emp_count NATURALN         := 0; 

NATURALNPOSITIVEN声明中,类型分类符后面必须跟上一个初始化子句。否则就会发生编译错误。例如,下面的声明就是不合法的:

line_items POSITIVEN;   -- not allowed; not initialized

 

对于同样数据类型的每一个变量,都必须单独声明:

i   SMALLINT;
j   SMALLINT;
k   SMALLINT;

像下面这样的声明方式是不允许的:

i, j, k   SMALLINT;   -- not allowed

 

命名解析

SQL语句中,数据库字段名称的优先级要高于本地变量和形式参数。例如,下面的DELETE语句会从emp表删除所有的雇员信息,而不只是名字为"KING"的雇员:

 

DECLARE

  ename   VARCHAR2 (10) := 'KING';

BEGIN

  DELETE FROM emp

        WHERE ename = ename;

  ... 

 

在这种情况下,为了避免产生歧义,可以像下面这样在本地变量和形式参数的前面加上类似于"my_"这样的前缀:

 

DECLARE

  my_ename VARCHAR2(10); 

 

或是使用块标签来进行引用限定:

 

<<main>>

DECLARE

  ename   VARCHAR2 (10) := 'KING';

BEGIN

  DELETE FROM emp

        WHERE ename = main.ename;

  ... 

 

下面的例子演示了如何使用子程序名称来限定对本地变量和形式参数的引用:

 

FUNCTION bonus (deptno IN NUMBER, ...) RETURN REAL IS

  job CHAR(10);

BEGIN

SELECT ... WHERE deptno = bonus.deptno AND job = bonus.job;

 

IN操作符是用于测试目标值是否是集合成员之一。其中,集合是可以包含NULL值的,但它们是被忽略的。例如,下面这个语句并不会删除ename值为NULL的行:

DELETE FROM emp WHERE ename IN (NULL, 'KING', 'FORD');

 

布尔字符表达式

我们也可以比较字符的等或不等。默认情况下,比较都是基于字符串中每个字节的二进制值的。比如,下面例子中的表达式结果就为真:

string1    := 'Katdy';
string2    := 'Katdleen';
string1 > string2   -- TRUE

 

布尔日期表达式

对于日期类型的比较,是按照年代的顺序的。如下例,date1的值是大于date2的值的。

date1    := '01-JAN-91';
date2    := '31-DEC-90';
date1 > date2   -- TRUE

 

CASE表达式

一个CASE表达式从一个或多个供选方案中选择一个返回结果。CASE表达式使用一个选择器来决定返回哪一个分支的结果。具体的语法形式如下:


CASE selector

  WHEN expression1 tdEN result1

  WHEN expression2 tdEN result2

  ...

  WHEN expressionn tdEN resultn

  [ELSE resultN+1]

END; 

选择器后面跟着一个或多个WHEN子句,它们会被依次验证的。一旦有一个WHEN子句满足条件的话,剩下的分支条件就不再执行了。例如:

DECLARE

  grade       CHAR(1)      := 'B';

  appraisal   VARCHAR2(20);

BEGIN

  appraisal    := CASE grade

  WHEN 'A' tdEN 'Excellent'

  WHEN 'B' tdEN 'Very Good'

  WHEN 'C' tdEN 'Good'

  WHEN 'D' tdEN 'Fair'

  WHEN 'F' tdEN 'Poor'

  ELSE 'No such grade'

   END;

END; 

 

其中,ELSE子句是可选的,工作方式同IF语句中的ELSE子句相似。如果我们不提供ELSE子句,并且选择器没有匹配任何WHEN子句,表达式的返回的结果就是NULL

这种形式的CASE表达式的另外一种使用方法就是CASE语句,其中每个WHEN子句都可以是一个完整的PL/SQL块。

 

在比较和条件语句中处理NULL

在使用NULL值时,我们一定要记住下面几条规则,避免发生一些常见的错误:

比较中如果有空值的话,那么计算结果总为NULL

对空值应用逻辑操作符NOT,结果还是NULL

条件控制语句中,如果条件的运算结果值为NULL的话,与之相关的语句就不会被执行

简单CASE语句中对于空值的判断要使用WHEN expression IS NULL

下例中,我们期待的是sequence_of_statements被执行,因为xy看起来就是不等的。但是,由于NULL是不确定的值,那么,x是否等于y也就无法确定了。所以,sequence_of_statements并不会执行。

 

x    := 5;

y    := NULL;

...

IF x != y tdEN   -- yields NULL, not TRUE

  sequence_of_statements; -- not executed

END IF; 

 

同样,下例中的sequence_of_statements也不会被执行:

a    := NULL;

b    := NULL;

...

IF a = b tdEN   -- yields NULL, not TRUE

  sequence_of_statements; -- not executed

END IF; 

 

零长度字符串

PL/SQL把零长度字符串当作空值处理,这其中包括由字符函数和布尔表达式返回的值。下面的语句均是给目标变量赋空值的操作:

null_string    := TO_CHAR('');
zip_code       := SUBSTR(address, 25, 0);
valid          :=(NAME != '');

所以,对于检测空字符串,要使用IS NULL操作符:

IF my_string IS NULL tdEN ...

 

函数REPLACE第二个参数是NULL的时候,它就会返回第一个参数的值,不管是否有第三个参数。例如,在下面例子中,结果字符串new_string的值和old_string的值完全一样。

new_string := REPLACE(old_string, NULL, my_string); 

如果第三个参数为空的话,REPLACE就会把第一个参数中出现的第二个参数删除,然后返回结果。如下面这个例子:

  syllabified_name    := 'gold - i - locks';

  NAME                := REPLACE(syllabified_name,

                                 ' - ',

                                 NULL

                                ); 

运算的结果字符串是"goldilocks"。如果第二个和第三个参数都是NULL值,REPLACE就直接返回第一个参数。

分享到:
评论

相关推荐

    PL/SQL 用户指南与参考

    第二章 PL/SQL基础 第三章 PL/SQL数据类型 第四章 PL/SQL的控制结构 第五章 PL/SQL集合与记录 第六章 PL/SQL与Oracle间交互 第七章 控制PL/SQL错误 第八章 PL/SQL子程序 第九章 PL/SQL包 第十章 PL/SQL对象...

    PL-SQL用户指南与参考

    ·第十二章 PL/SQL应用程序性能调优 2008-04-08 · 第十一章 本地动态SQL 2008-04-08 · 第十章 PL/SQL对象类型 2008-04-08 ...· 第二章 PL/SQL基础 2008-04-08 · 第一章 PL/SQL一览

    Oracle PL/SQL程序设计(第5版)(下册)第二部分

    第16章 动态SQL和动态PL/SQL 492 目 录(下册) 第5部分 构造PL/SQL应用程序 第17章 过程、函数与参数 543 第18章 包 593 第19章 触发器 626 第20章 管理PL/SQL代码 685 第21章 PL/SQL的性能优化 753 第22章 I/O操作和...

    PL/SQL经典介绍

    第二章 PL-SQL基础 第三章 PL-SQL数据类型 第四章 PL-SQL的控制结构 第五章 PL-SQL集合与记录(1) 第六章 PL-SQL集合与记录(2) 第七章 PL-SQL与Oracle间交互 第八章 控制PL-SQL错误 第九章 PL-SQL子程序 第十章 ...

    sql pl/sql存储过程

    SQL and Pl/SQL培训文档 第一天 第一章 PL/SQL 简介 安装scott/tigger用户模式 Example1 标准的PL/SQL块结构 ...第二章 PL/SQL数据类型 预定义数据类型 数值数据类型 字符数据类型 字符数据类型(续) LOB数据类型

    Oracle 11g SQL和PL SQL从入门到精通 pdf格式电子书 下载(二)

    第二部分 sql  第5章 sql和pl/sql综述  第6章 简单查询  第7章 sql单行函数  第8章 操纵数据  第9章 复杂查询  第10章 管理常用对象 第三部分 pl/sql  第11章 pl/sql基础  第12章 访问oracle  第13章 编写...

    Oracle 11g SQL和PL SQL从入门到精通〖送源代码〗

    第二部分SQL  第5章SQL和PL/SQL综述  第6章简单查询  第7章SQL单行函数  第8章操纵数据  第9章复杂查询  第10章管理常用对象 第三部分PL/SQL  第11章PL/SQL基础  第12章访问Oracle  第13章编写控制结构  ...

    Oracle 11g SQL和PL SQL从入门到精通 pdf格式电子书 下载(一)

    第二部分 sql  第5章 sql和pl/sql综述  第6章 简单查询  第7章 sql单行函数  第8章 操纵数据  第9章 复杂查询  第10章 管理常用对象 第三部分 pl/sql  第11章 pl/sql基础  第12章 访问oracle  第13章 编写...

    PL/SQL 简介

    PL/SQL 快速指南 简介快速的介绍了PL/SQL的语法,适合初级入门

    PLSQL用户指南与参考.pdf

    第二章 PL/SQL 基础 第三章 PL/SQL 数据类型 第四章 PL/SQL 的控制结构 第五章 PL/SQL 集合与记录 第六章 PL/SQL 与 Oracle 间交互 第七章 控制 PL/SQL 错误 第八章 PL/SQL 子程序 第九章 PL/SQL 包 第十章 PL/SQL ...

    PL/SQL程序设计

    第一章 PL/SQL 程序设计简介 第二章 PL/SQL 块结构和组成元素 第三章 PL/SQL 流程控制语句 第四章 游标的使用 第五章 异常错误处理 第六章 存储函数和过程 第七章 包的创建和应用 第八章 触发器

    PL/SQL 基础.doc

    ---- 第二章 PL/SQL程序结构 ---- 1. PL/SQL块 1) 申明部分, DECLARE (如果语句不需要声明任何变量,可以不写); 2) 执行部分, BEGIN &lt;---------&gt; END; 3) 异常处理,EXCEPTION(可以没有); 2. PL/SQL开发环境 ...

    Oracle 11g SQL和PL SQL从入门到精通.part1

     第11章 pl/sql基础  第12章 访问oracle  第13章 编写控制结构  第14章 使用复合数据类型  第15章 使用游标  第16章 异常处理 . 第17章 本地动态sql  第18章 pl/sql过程  第19章 pl/sql函数  第20章 pl/...

    Oracle PL SQL程序设计 上 第五版part2

    共2部分,这是第二部分。 《oracle pl/sql程序设计(第5版)》基于oracle数据库11g,从pl/sql编程、pl/sql程序结构、pl/sql程序数据、pl/sql中的sql、pl/sql应用构建、高级pl/sql主题6个方面详细系统地讨论了pl/sql...

    Oracle 11g SQL和PL SQL从入门到精通part2 pdf格式电子书 下载(二)

    第二部分 sql  第5章 sql和pl/sql综述  第6章 简单查询  第7章 sql单行函数  第8章 操纵数据  第9章 复杂查询  第10章 管理常用对象 第三部分 pl/sql  第11章 pl/sql基础  第12章 访问oracle  第13章 编写...

    ORACLE 数据库开发_PLSQL基础.doc

    ---- 第二章 PL/SQL程序结构 ---- ---- 第三章 变量与数据类型 ---- ---- 第四章 PL/SQL控制语句 ---- ---- 第五章 PL/SQL游标 ---- ---- 第六章 HANDLE EXCEPTION ---- ---- 第七章 SUB PROGRAM ---- ---- 第八章...

    PL-SQL程序设计

    学习PL-SQL的非常好,非常简洁的一本书籍。...第二章 PL/SQL块结构和组成元素 第三章 PL/SQL流程控制语句 第四章 游标的使用 第五章 异常错误处理 第六章 存储函数和过程 第七章 包的创建和应用 第八章 触发器

    PL\SQL 编程设计

    第二章 PL/SQL块结构和组成元素;第三章 PL/SQL流程控制语句;第四章 游标的使用;第五章 异常错误处理;第六章 存储函数和过程;第七章 包的创建和应用;第八章 触发器;第九章 ORACLE提供的常用包。 实例多。共计 ...

    PLSQL基础教程

    第二章 PL/SQL块结构和组成元素 6 §2.1 PL/SQL块 6 §2.2 PL/SQL结构 6 §2.3 标识符 6 §2.4 PL/SQL 变量类型 7 §2.4.1 变量类型 7 §2.4.2 复合类型 9 §2.4.3 使用%ROWTYPE 11 §2.4.4 LOB类型* 11 §...

    PLSQL程序设计

    第二章 PL/SQL块结构和组成元素 6 §2.1 PL/SQL块 6 §2.2 PL/SQL结构 6 §2.3 标识符 6 §2.4 PL/SQL 变量类型 7 §2.4.1 变量类型 7 §2.4.2 复合类型 9 §2.4.3 使用%ROWTYPE 11 §2.4.4 LOB类型* 11 §2.4.5 ...

Global site tag (gtag.js) - Google Analytics