1.字符集
PL/SQL的字符集包括:
- 所有大小写字母:包括A~Z和a~z。
- 数字:包括0~9.
- 空白字符:包括制表符、空格和回车符
- 其他常用英文符号
2.标识符
标识符用于定义PL/sql变量、常量、异常、游标名称、游标变量、参数、子程序名称和其他程序单元名称等。
PL/sql程序中,标识符是以字符开头的,后边可以跟字符、数字、美元符号($)、#、_,其最大长度为30个字符,并且所有字符都是有效的。
3.分隔符
分隔符是指有特殊含义的单个符号或组合符号。
符号 | 说 明 | 符号 | 说 明 |
+ | 算数加或表示为整数 | - | 算数减或表示为负数 |
* | 算数乘 | / | 算数除 |
= | 关系等 | := | 赋值运算符 |
< | 关系小于 | > | 关系大于 |
<= | 关系小于等于 | >= | 关系大于等于 |
!= | 关系不等于(<>, ^=, ~=) | ; | 语句结束符 |
( | 括号运算符开始 | ) | 括号运算符结束 |
/* | 多行注释开始 | */ | 多行注释结束 |
<< | 其实标签 | >> | 结束标签 |
% | 游标属性指示符或代表任意个字符的通配符 | _ | 代表一个字符的通配符 |
: | 主机变量指示符 | . | 表示从属关系符号 |
‘ | 字符串标示符 | " | 引证标示符 |
-- | 单行注释符 | || | 字符串连接符号 |
=> | 位置定位符号 | ** | 幂运算符 |
4.常量值
所谓常量值是指不能作为标示符的字符型、数字型、日期型和布尔型值。
(1)字符型文字:即以单引号引起来的字符串,在字符串中的字符区分大小写。如果字符串中本身包含单引号,则用两个连续的单引号进行转义。例如:‘student‘‘book’;
(2)数字型文字:分为整数和实数两类。可以使用科学技术法表示数字型文字。
(3)布尔型文字:指示预定义的变量的取值,包括True,False,Null三个值
(4)日期类型:表示日起值,其格式随日期类型格式不同二不同。
5.数据类型
PL/sql数据类型包括基本数据类型、基本类型子类型、用户自定义类型三类
- 数字类型:Binary_Integer,Pls_Interger,number
- 字符类型:Char,Nchar,Varchar2,Nvarchar2,varchar
- 日期/区间类型:Date,TimeStamp,Interval
- 行标识符:RowID,URowID
- 布尔类型:Boolean
- 原始类型:Raw,Long Raw
- Lob类型:Clob,Blob,Nclob,Bfile
- 记录类型:Record
- 集合类型:Table
注意:
- varchar2,char主要是用于存储来自数据库字符集的字符,而ncahar,nvarchar2用于存储来自国家字符集的字符串。
- RowID表示行的物理地址,而URowID既可以是行的物理地址,也可以是表示行的逻辑地址。
- Blob存放二进制数据,Clob,Nclob存放文本数据,而Bfile存储指向操作系统的指针。lob类型变量可以存储4GB的数据量。
- 记录类型:
前面介绍的数据类型都是标量数据类型,是系统预定义的。而复合类型,如记录类型,集合类型等需要用户自己定义。
在PL/Sql中,记录类型类似于C语言中的结构体。举例:
Declare
Type t_emp Is Record(
empn0 number(4),
ename varchar2(100),
sal number(6,2)
);
v_temp t_emp;
Begin
Select empno,ename,sal Into v_temp from emp where empno=100;
DBMS.OUTPUT.PUT_LINE(v_temp .ename||v_temp .sal);
End;
相同记录类型的变量可以相互赋值;不同记录类型的变量,即使成员完全相同也不能相互赋值;
记录类型只能应用于定义该记录类型的PL/sql块中,即记录类型是局部的。
5.集合类型:
集合类型也是符合类型,包括索引表类型、嵌套类型和可变数组类型。集合类型与记录类型的区别是记录类型中的成员分量可以是不同类型的,类似于结构体,而集合类型中所有的成员必须具有相同的数据类型,类似于数组。
(1)索引表类型:
语法:
TYPE index_table IS TABLE OF element_type
INDEX BY BINARY_INTEGER | PLS_INTEGER | VARCHAR2(N)
举例:
DECLARE
TYPE emp_table IS TABLE OF char(10) INDEX BY BINARY_INTEGER;
v_enames emp_table;
BEGIN
select ename into v_enames(0) from emp where empno=100;
select ename into v_enames(1) from emp where empno=200;
END;-----------------------索引表类型只能应用于定义该类型的PL/sql块中。
(2)嵌套表类型
嵌套表类型中元素索引值从1开始,没有固定上限。定义语法:
TYPE nested_table IS TABLE OF element_type[NOT NULL];
(3)可变数组类型
可变数组类型中元素索引值从1开始,有固定的上限。
TYPE varrary_name IS VARRAY | VARYING ARRAY (maxinum_size)
OF element_type [NOT NULL]
如果将可变数组类型定义与数据库的模式中,则此类型是全局的。
6.%Type与%RowType
如果要定义一个类型与某个变量的数据类型或数据库表中某个列的数据类型一致(不知道该变量或列的数据类型)的变量,可以使用%type来实现。
如果要定义一个与数据库中某个表结构一致的记录类型的变量,可以使用%RowType来实现。
- 变量的类型随参照的变量类型,数据库列表的类型,表结构的变化而变化
- 如果数据库表列中有NOT NULL 约束,%type,与%rowType返回的数据类型没有此限制。
6.变量与常量
(1)变量与常量的定义:
variable_name [CONSTANT] datatype [NOT NULL] [DEFAULT | :=expression];
说明:
- 每行只能定义一个变量;
- 如果加上一个关键字CONSTANT,则表示所定义的是一个常量 ,必须为它初始值;
- 如果定义变量时使用了NOT NULL关键字,则必须为变量赋初始值
- 如果变量没有赋初始值,则默认为null
- 使用DEFAULT 或“:=”为变量初始化
(2)变量的作用域
变量的作用域是指变量的有效作用范围,从变量的生命开始,直到块结束。如果PL/sql块相互嵌套,则在内部块中声明的变量是局部的,只能在内部块中引用,而外部块中声明的变量时全局的,即可以在外部块中引用,也可以在内部块中引用。
如果内部块与外部块中定义了同名的变量,则在内部块中的引用外部块的全局变量时需要使用外部块名进行标示。
例如:
<<OUTER>>
DECLARE
v_enname varchar2(100);
BEGIN
v_ename :=‘zhangsan‘;
DECLARE
v_name varchar2(100);
BEGIN
v_name=‘this is INNER V_NAME‘;
OUTER.v_name=‘this is OUTER v_name‘;
END;
END;
7.编译指示
编译指示是对编译程序发出的特殊指令,也称为伪指令,不会改变程序的定义。它只是向编译程序传递信息,类似于嵌入在Sql中的注释。
在PL/sql中使用Pragma关键字通知编译程序,PL/sql语句的剩余部分是一个编译指示或命令。编译指示在编译时被处理,而不会在运行时被执行,类似于C语言中的#define,有四种编译指示:
- EXCEPTION_INIT:告诉编译程序一个特定的错误号与程序中所声明的异常标识符关联起来
- RESTRICT_REFERENCES:告诉编译程序打包程序的纯度,对函数中可以使用的Sql语句和变量进行限制。
- SERIALLY_REUSEABLE:告诉PL/sql运行引擎时,在数据引用之间不要保持包级数据。
- AUTONOMOUS_TRANSCTION:告诉编译程序,改程序块为自制事务,即该事务的提交和回滚是独立运行的。
例如:
DECLARE
no_such_sequece EXCEPTION;
PRAGMA EXCEPTION_INIT(no_such_sequece,-2289)
BEGIN
END;