本文章讲解PL/SQL的基础学习
一、PL/SQL是什么?
PL/SQL(Procedural Langage/SQL,也称过程语言/SQL)是Oracle过程语言和机构化查询语言的一种扩展增强语言,使得PL/SQL可以编写高级的功能。
1.)PL/SQL的体系结构
1.PL/SQL引擎用来编译和执行PL/SQL块或子程序,此引擎驻留在Oracle服务器中。PL/SQL仅执行过程语言。
2.PL/SQL块是一种块结构语言,它将一组语句放在一个块内,PL/SQL块将逻辑上相关的声明和语句组合在一起。
一个PL/SQL块由三部分,声明,执行,异常部分。
--------------------------------------------------------------------
[DECLARE]
--声明部分:PL/SQL的变量,类型和游标,以及局部的存储过程和函数
BEGIN
--执行部分:过程及SQL语句,主要部分
[EXCEPTION]
--异常部分,错误处理
END;
常量和变量的声明
--Oracle11g新特性,可以使用PL/SQL块中的赋值语句范围控制
v_no :=emp_seq.nextval;
--变量常量的声明
var_name data_type[(size)] [:=init_value]
--var_name 变量的名称
--data_type 数据类型
--size 变量的范围
--init_value 变量的初始化值
--声明规范
--标识符名不能超过30个字符
--第一个字符必须是字母
--不区分大小写
--不能用- 减号
--不能是SQL关键字
变量名规范
标识符 | 命名规则 | 示例 |
---|---|---|
程序变量 | v_name | v_student |
程序常量 | c_name | c_company |
游标变量 | cursor_name | cursor_emp |
异常标志 | e_name | e_too_many |
表类型 | name_table_type | emp_record_type |
表 | name_table | emp_table |
记录类型 | name_record | emp_record |
绑定变量 | g_name | g_year_sal |
二、PL/SQL控制语句
1.条件控制IF语句,CASE语句
IF <布尔表达式> THEN
PL/SQL和SQL语句
END IF;
--带ELSE的
IF <布尔表达式> THEN
PL/SQL和SQL语句
ELSE
--其他语句
END IF;
--带ELSIF的
IF <布尔表达式> THEN
PL/SQL和SQL语句
ELSIF <布尔表达式> THEN
--其他语句
ELSE
--其他语句
END IF;
----------------------------------CASE语句--------------------------------------------------
CASE 条件表达式
WHEN 条件表达式结果1 THEN
--语句段1
WHEN 条件表达式结果2 THEN
--语句段2
...
WHEN 条件表达式结果n THEN
--语句段n
[ELSE 语句段]
END CASE;
-----------------------------------第二种写法-----------------------------------------------
CASE
WHEN 条件表达式结果1 THEN
--语句段1
WHEN 条件表达式结果2 THEN
--语句段2
...
WHEN 条件表达式结果n THEN
--语句段n
[ELSE 语句段]
END CASE;
2.循环控制
用于重复执行一系类语句,循环控制包括LOOP循环,WHILE循环,FOR循环
--1.LOOP循环
LOOP
--要执行的语句
EXIT WHEN <条件语句> --满足退出循环
END LOOP;
--示例
DECLARE
x number(4) := 100; --每次加100;
v_sal employee.sal%type; --属性类型变量;
BEGIN
SELECT sal INTO v_sal FROM employee WHERE ename='SCOTT';
LOOP
dbms_output.put_line('现在的工资是'||v_sal);
UPDATE employee
SET sal=sal+x --每次执行循环就更改语句+100
WHERE ename='SCOTT';
SELECT sal INTO v_sal FROM employee WHERE ename='SCOTT';
IF v_sal >=10000 THEN --加到10000时条件满足退出循环
exit;
END IF;
END LOOP;
END;
--2.WHILE循环
WHILE <布尔表达式> LOOP
--要执行的语句;
END LOOP;
--示例
DECLARE
v_log number(2) := 10; --初始值10
BEGIN
WHILE v_log < 20 LOOP --小于20 满足就执行循环 FLG
dbms_output.put_line(x);
v_log := v_log + 1; --每次加1 在返回到FLG判断
END LOOP;
END;
--3.FOR
FOR 循环计数器 IN [ REVERSE ] 下限...上限 LOOP
要执行的语句
END LOOP;
--示例
DECLARE
v_log number(2);
BEGIN
FOR v_log IN 7 .. 21 LOOP
dbms_output.put_line(x);
END LOOP;
END;
输出结果:
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
3.顺序控制
用于按照自己想要的顺序执行,包括NULL,GOTO语句(在此不示例)
NULL语句是一个可执行的语句,相当于一个占位符或不执行任何操作的空语句
--要求,显示变量v_count的值,如果小于10,则增加10在显示v_count的值
DECLARE
v_count NUMBER :=1;
BEGIN
dbms_output.put_line('v_count当前的值是:'||v_count);
IF v_count>=10 THEN
NULL;
ELSE
v_count :=v_count + 10 ;
dbms_output.put_line('v_count+10后的值是:'||v_count);
END IF;
END;