一、PL/SQL 块结构和组成元素

PLSQL

一、PL/SQL 程序设计简介

PL/SQL是一种高级数据库程序设计语言,该语言专门用于在各种环境下对ORACLE数据库进行访问。由于该语言集成于数据库服务器中,所以PL/SQL代码可以对数据进行快速高效的处理。除此之外,可以在ORACLE数据库的某些客户端工具中,使用PL/SQL语言也是该语言的一个特点。

二、PL/SQL 块结构和组成元素

PL/SQL 块

PL/SQL 程序由三个块组成,即声明部分、执行部分、异常处理部分

PL/SQL 块的结构如下:
DECLARE
/* 声明部分: 在此声明 PL/SQL 用到的变量,类型及游标,以及局部的存储过程和函数 */
BEGIN
/*	执行部分:	过程及 SQL 语句 , 即程序的主要部分 */
EXCEPTION
/* 执行异常部分: 错误处理 */
END;
--其中 执行部分是必须的。
PL/SQL 块可以分为三类:
  • 无名块:动态构造,只能执行一次
  • 子程序:存储在数据库中的**存储过程函数**及包等。当在数据库上建立好后可以在其它程序中调用它们
  • 触发器:当数据库发生操作时,会触发一些事件,从而自动执行相应的程序

PL/SQL 结构

  • PL/SQL 块中可以包含子块
  • 子块可以位于 PL/SQL 中的任何部分
  • 子块也即 PL/SQL 中的一条命令

标识符

PL/SQL 程序设计中的标识符定义与 SQL 的标识符定义的要求相同。要求和限制有:

  • 标识符名不能超过 30 字符
  • 第一个字符必须为字母
  • 不分大小写
  • 不能用’-‘(减号);
  • 不能是 SQL 保留字。

提示 :一般不要把变量名声明与表中字段名完全一样,如果这样可能得到不正确的结果

--例如:下面的例子将会删除所有的纪录,而不是KING 的记录;

DECLARE

Ename varchar2(20) := ’KING’; 

BEGIN

DELETE FROM emp WHERE ename=ename;

END;

变量命名在 PL/SQL 中有特别的讲究,建议在系统的设计阶段就要求所有编程人员共同遵守一定的要求, 使得整个系统的文档在规范上达到要求。下面是==建议的命名方法==:

标识符 命名规则 例子
程序变量 **V_**name V_name
程序常量 **C_**Name C_company_name
游标变量 Name**_cursor** Emp_cursor
异常标识 **E_**name E_too_many
表类型 Name_table_type Emp**_record_type**
Name_table Emp
记录类型 Name**_record** Emp_record
SQL*Plus 替代变量 P_name P_sal
绑定变量 G_name G_year_sal

PL/SQL 变量类型

在前面的介绍中,有系统的数据类型,也可以自定义数据类型。下表是 ORACLE 类型和 PL/SQL 中的变量类型的合法使用列表:

变量类型

在 ORACLE8i 中可以使用的变量类型有:

类型 子类 说 明 范 围 ORACLE 限制
CHAR Character String Rowid Nchar 定长字符串 民族语言字符集 0à32767 可选,确省=1 2000
VARCHAR2 Varchar, String NVARCHAR2 可变字符串 民族语言字符集 0à32767 4000 4000
BINARY_INTEG ER 带符号整数,为整数计算优 化性能
NUMBER(p,s) Dec Double 小数, NUMBER 的子类型高精度实数 整数, NUMBER 的子类型
类型 子类 说 明 范 围 ORACLE 限制
precision Integer Int Numeric Real Small int 整数, NUMBER 的子类型与NUMBER 等价 与NUMBER 等价整数, 比 integer 小
LONG 变长字符串 0->2147483647 32,767 字节
DATE 日期型 公元前 4712 年 1 月 1 日至公元后 4712 年 12 月 31 日
BOOLEAN 布尔型 TRUE, FALSE,NULL 不使用
ROWID 存放数据库行号
UROWID 通用行标识符,字符类型
复合类型

ORACLE 在 PL/SQL 中除了提供象前面介绍的各种类型外,还提供一种称为复合类型的类型—记录和表.

一、PL/SQL 块结构和组成元素

记录类型

记录类型是把逻辑相关的数据作为一个单元存储起来,称作 PL/SQL RECORD 的域(FIELD),其作用是存放互不相同但逻辑相关的信息

定义记录类型语法如下:

TYPE record_type IS RECORD(
Field1 type1	[NOT NULL]	[:= exp1 ],
Field2 type2	[NOT NULL]	[:= exp2 ],
. . .	. . .		
Fieldn typen	[NOT NULL]	[:= expn ] ) ;

一、PL/SQL 块结构和组成元素


一、PL/SQL 块结构和组成元素

一、PL/SQL 块结构和组成元素

%ROWTYPE

PL/SQL 提供**%ROWTYPE 操作符, 返回一个记录类型, 其数据类型和数据库表的数据结构相一致**。使用%ROWTYPE 特性的优点在于:

  • 所引用的数据库中列的个数和数据类型可以不必知道
  • 所引用的数据库中列的个数和数据类型可以实时改变

一、PL/SQL 块结构和组成元素

运算符和表达式(数据定义)

关系运算符
运算符 意义
= 等于
<> , != , ~= , ^= 不等于
< 小于
> 大于
<= 小于或等于
>= 大于或等于
一般运算符
运算符 意义
+ 加号
- 减号
* 乘号
/ 除号
:= 赋值号
=> 关系号
范围运算符
|| 字符连接符
逻辑运算符
运算符 意义
IS NULL 是空值
BETWEEN AND 介于两者之间
IN 在一列值中间
AND 逻辑与
OR 逻辑或
NOT 取返,如 IS NOT NULL, NOT IN

变量赋值

在 PL/SQL 编程中,变量赋值是一个值得注意的地方,它的语法如下:

*:=====*

variable   := expression ;

variable 是一个PL/SQL 变量, expression 是一个 PL/SQL 表达式.

字符及数字运算特点

空值加数字仍是空值:NULL + < 数字> = NULL

空值加(连接)字符,结果为字符:NULL || <字符串> = < 字符串>

BOOLEAN 赋值

布尔值只有 TRUE, FALSE 及 NULL 三个值

数据库赋值

数据库赋值是通过 SELECT语句来完成的,每次执行 SELECT语句就赋值一次,一般要求被赋值的变量与SELECT中的列名要一一对应

DECLARE
emp_id	emp.empno%TYPE :=7788; emp_name emp.ename%TYPE;
wages	emp.sal%TYPE;
 
BEGIN
SELECT ename, NVL(sal,0) + NVL(comm,0) INTO emp_name, wages FROM emp WHERE empno = emp_id;
DBMS_OUTPUT.PUT_LINE(emp_name||’	‘||to_char(wages));
END;


提示:不能将SELECT语句中的列赋值给布尔变量

可转换的类型赋值

CHAR 转换为 NUMBER:

使用 TO_NUMBER 函数来完成字符到数字的转换,如:

v_total := TO_NUMBER(‘100.0’) + sal;

NUMBER 转换为 CHAR:

使用 TO_CHAR 函数可以实现数字到字符的转换,如:

v_comm := TO_CHAR(‘123.45’) || ’元’ ;

字符转换为日期:

使用 TO_DATE 函数可以实现 字符到日期的转换,如:

v_date := TO_DATE(‘2001.07.03’,‘yyyy.mm.dd’);

日期转换为字符

使用 TO_CHAR 函数可以实现日期到字符的转换,如:

v_to_day := TO_CHAR(SYSDATE, ‘yyyy.mm.dd hh24:mi:ss’) ;

变量作用范围及可见性

在 PL/SQL 编程中,如果在变量的定义上没有做到统一的话,可能会隐藏一些危险的错误,这样的原因主要是变量的作用范围所致。与其它高级语言类似,PL/SQL 的变量作用范围特点是:

  • l 变量的作用范围是在你所引用的程序单元(块、子程序、包)内。即从声明变量开始到该块的结束。
  • l 一个变量(标识)只能在你所引用的块内是可见的。
  • l 当一个变量超出了作用范围,PL/SQL 引擎就释放用来存放该变量的空间(因为它可能不用了)。
  • l 在子块中重新定义该变量后,它的作用仅在该块内。

注释

在PL/SQL里,可以使用两种符号来写注释,即:

  • 使用双 ‘-‘ ( 减号) 加注释

    --PL/SQL允许用 – 来写注释,它的作用范围是只能在一行有效。如:
    V_Sal	NUMBER(12,2); -- 工资变量。
    
  • 使用 ==/ /== 来加一行或多行注释

    /***********************************************/
    /*  文件名: department_salary.sql	*/
    /***********************************************/
    
    
    

    提示:被解释存放在数据库中的 PL/SQL 程序,一般系统自动将程序头部的注释去掉。只有在 PROCEDURE之后的注释才被保留;另外程序中的空行也自动被去掉。

上一篇:隐含参数_optimizer_use_feedback


下一篇:场景类:vue多个router-view路由嵌套