PL/Sql是一种过程化语言,它能实现操控程序处理的细节过程,使用PL/SQL语言可以实现较为复杂的业务逻辑,PL/SQL是orcale的专用语言,他是对标准的SQL语言的扩展,它允许在其内部嵌套普通的SQL语言,这样就能将SQL语言的数据操纵能力、数据查询能力和PL/Sql的过程处理能力结合在一起。
一、PL/SQL块结构
PL/SQL程序都是以块结构为基本单位,整个PL/SQL块分为三部分:声明部分(用DECLARE开头)、执行部分(BEGIN开头)、异常处理部分(EXCEPTION开头),其中执行部分是必须的,其余那个部分可选
[DECLARE]
—声明部分,可选
—声明PL/SQL程序块中所用到的变量、常量和游标等
—声明的内容只能当前块使用,其余块无法引用
BEGIN
—执行部分, 必须
—主要的逻辑控制和运算
—以end结束或者出现异常执行异常处理部分
[EXCEPTION]
—异常处理部分, 可选
eg:定义一个PL/SQL代码块,计算两个整数的和与两个整数的差的商
set serveroutput on ----服务端显示执行结果
DECLARE
a int:= 10;
b int:= 20;
c number;
begin
c := (a+b)/(a-b);
dbms_output.put_line(c);
EXCEPTION
when zero_divide then
dbms_output.put_line('除数不能为0');
end;
/
二、代码注释和标识
注释用于对程序代码的解释说明,增强程序的可读性,注释编译时被PL/SQL的编译器所忽略调,注释分为单行注释和多行注释。
另外PL/SQL声明的常量、变量、游标和存储过程的名称由一系列的字符集所组成。orcale对这些组成标识符的字符集有一定的规范和要求。
- 单行注释
单行注释由两个连接字符’–'开始,后面紧跟注释内容 - 多行注释
多行注释由/*开头,由 */结尾
eg:编写一段PL/SQL代码并未主要代码写上单行或多行注释
set serveroutput on
> DECLARE
> num_sal number; -- 声明一个数值变量用来存储工资
> var_name varchar2(20); /*声明一个字符串变量*/
> begin
> select name,sal into var_name,num_sal from emp
> where empno = 7369;
> dbms_output.put_line('员工'||var_name||'的工资是'||num_sal);
> end;
- 字符集
PL/SQL合法的字符集有以下内容 - 大写和小写字母: A~Z, a ~ z
- 数字: 0-9
- 非显示的字符: 制表符、空格、回车
- 数学符号:+, - ,* ,/ ,> , < , = 等
- 间隔符 : () ,{} ,? ,! ,; < , : @ # % $ & 等
三、数据类型与定义变量和常量
- 基本数据类型我们用一张图来说明
- 特殊数据类型
- %TYPE类型
使用%TYPE类型可以声明一个与指定列相同的数据类型
eg:使用%TYPE类型的变量输出emp表中编号为7396员工的名称和职务信息。
- %TYPE类型
DECLARE
var_job emp.job%type;
var_ename emp.ename%type;
begin
select ename,job into var_ename,var_job from emp
where empno = 7396;
dbms_output.put_line(var_ename||'的职务是'||var_job);
end;
- RECORD类型
RECORD类型也叫记录类型,存储由多个列存储的一行记录,在声明record变量之前,首先需要定义记录类型, 记录类型是一种结构化的数据类型。语法格式如下
type record_type is record -- record_type -- 定义记录类型名称
(
var_number1 data_type[not null] [:= defaut_value], --var_number1 表示记录类型的成员变量名称
var_number2 data_type[not null] [:= defaut_value],--data_type成员变量的数据类型
)
eg:声明一个记录类型,然后使用该类型的变量存储emp表的一条记录信息,并输出这条信息
set serveroutput on
DECLARE
type record_emp is record
(
var_ename varchar2(20),
var_job varchar2(20),
var_sal number
);
empinfo record_emp;
begin
select ename,job,sal into empinfo from emp
where empno = 7369;
dbms_output.put_line('雇员'||empinfo.var_ename||'职务为'||empinfo.job||'薪资'||empinfo.sal);
end;
- %ROWTYPE类型
用来存储从数据表中检索到的一行数据,语法形式如下
rowVAR_name table_name%rowtype;--rowVAR_name --可以存储一行数据的变量名
-- table_name指定的表名
eg:声明一个%ROWTYPE类型的变量rowVar_emp 然后使用rowVar_emp 变量来存储emp表的一行数据
set serveroutput on
DECLARE
rowVar_emp emp%rowtype;
begin
select *
into rowVar_emp
from emp
where empno = 7369;
dbms_output.put_line('雇员'||rowVar_emp.ename||'职务为'||rowVar_emp.job||'薪资'||rowVar_emp .sal);
end;
- 定义变量
<变量名> <数据类型> [(长度):=<初始值>];
var_ename Varchar2(20) := 'SALE';
var_num number;
- 定义常量
<常量名> constant<数据类型> := <常量值>
con_day constant integer := 365;