@[TOC]Oracle数据库PLSQL学习
PLSQL数据库的学习
PLSQL是什么
- 是专用于Oracle服务器,在SQL基础之上,添加了一些过程化控制语句,叫PLSQL
- 过程化包括:类型定义,判断,循环,游标,异常或例外处理
PLSQL语法
declare和exception都是可以省略的,'begin和end;'不能省略
[declare]
变量声明;
变量声明;
begin
DML/TCL操作;
DML/TCL操作;
[exception]
例外处理;
例外处理;
end;
在PLSQL程序中: ‘;’号表示每条语句的结束;‘ / ’表示整个PLSQL程序的结束
PLSQL与SQL执行有什么不同·:
- SQL是单条执行
- PLSQL是整体执行,不能单条执行,整个PLSQL结束用“ / ”,其中每条语句结束用‘;’号
PLSQL变量
既然PLSQL是注重过程的,那么写的过程的程序就肯定有基本的语法,首先是变量:
PLSQL变量有四种
- number i number(2);
- varchar2 my varchar2:=‘基于’;
- 与列名类型相同%type me emp.ename%type;
- 与整个表的列类型相同%rowtype id emp%rowtype;
注意
PLSQL程序的执行结果,默认情况下,不显示PLSQL程序的执行结果,语法:set serveroutput on/off; - 声明变量时,必须指定类型
- 变量名需要先赋值,后使用
- 变量名没有默认值(表现是空,无意义)
例题:
1、 使用基本类型变量,常量和注释,求10+100的和
declare
–定义变量
mysum number(3) :=0;
tip varchar2(10) :=‘结果是’;
begin
–业务算法
mysum :=10+100;
–输出到控制器
dbms_output.put_line(tip || mysum);
end;
2、输出7369号员工姓名和工资,格式如下:7369号员工的姓名是SMINTH,语法:使用表名.字段%type
declare
–定义两个变量,分别装姓名和工资
pname emp.ename%type;
psal emp.sal%type;
begin
–spl语句
–select ename,sal from emp where empno=7369;
–PLQSL语句,将ename,sal的值放入到pename,psal中
select enmae,sal into pename,psal from where empno=7369;
–输出
dbms_output.put_line(‘7369号员工的姓名是’ || pename|| ‘,薪水是’ || psal);
end;
3、输出7788号员工姓名和工资,格式如下:7369号员工的姓名是SMITH,薪水是3000,语法:使用表名%rowtype;
declare
emp_record emp%rowtype;
begin
select * into emp_record from emp where empno=7788;
dbms_output.put_line(‘7788号员工的是’ ||emp_record.ename || ‘,薪水是’ || emp_record.sal);
end;
何时使用%type,何时i使用%rowtype;
8. 当定义变量时t,该变量的类型与表中某字段的类型相同时,可以使用%type
9. 当定义量时,该变量与整个表结构完全相同时,可以使用%rowtype,此时通过变量名.字段名,可以取值变量中对应的值
10. 项目中常用%type
insert操作,接受返回值
declare
v_depId departments.department_id%type;
v_depName departments.department_name%type;
v_managerId departments.manager_id%type;
begin
insert into departments(department_id,department_name,manager_id,location_id) values(600,’‘shanghai,200,1700)
–接收返回值
returning department_id,department_name,manager_id
–装载变量,要和返回值的数量保持一致
into v_depId,v_depName,v_managerId;
dbms_output.put_line(v_depId || ‘ ’ || ‘ ’v_depName || ’ ’ || v_managerId);
end;
update操作,接收返回值
declare
v_depId departments.department_id%type;
v_info varchar2(40);
begin
update departments set department_name=‘北京’ where department_id=600
–接收返回值
returning department_id,department_name || ’ ’ || manager_id
–装载变量,要和返回值的数量保持一致
into v_depId,v_info;
dbms_output.put_line(v_depId || ’ ’ || ’ ’ || v_info);
end;
delete操作,接收返回值
declare
v_depId departments.department_id%type;
v_info varchar2(40);
begin
delete from departments where department_id=600
–接收返回值
ruturning department_id,department_name || ’ ’ || manager_id
–装载变量,要和返回值数量保持一致
dbms_output.put_line(v_depId || ’ ’ || ’ ’ || v_info);
end;
数组类型
declare
–定义一个数组
type type_array id array(3) of varchar(32);
–赋值一个变量为数组
v_type_array type_array;
begin
–变量赋值
v_type_array:=type_array(‘China’,‘Japan’,‘England’);
–输出
dbms_output.put_line(v_type_array(1)|| ’ ’ ||v_type_array(2)|| ’ ’ || v_type_array(3));
end;
异常处理EXCEPTION
declare
v_input_empNum number:=’&input_empNum’;
v_emp employees%rowtype;
begin
select * into v_emp from employees where employee_id=v_input_empNum;
dbms_output.put_line(v_input_empNum);
dbms_output.put_line(v_emp.first_name);
execption
when NO_DATA_FOUND then
dbms_output.i(‘未找到该员工’);
end;
判断体
11. IF 条件 THEN
PL/SQL和SQL语句;
END IF;
-
IF 条件 THEN
PL/SQL和SQL语句;
ELSE
PL/SQL和SQL语句;
END IF; -
IF 条件 THEN
PL/SQL和SQL语句;
ELSIF 条件 THEN
PL/SQL和SQL语句;
ELSE
PL/SQL和SQL语句;
case
CASE 条件表达式
WHEN 条件表达式结果1 THEN
语句段1
WHEN 条件表达式结果2 THEN
语句段2
…
WHEN 条件表达式结果n THEN
语句段n
ELSE 条件表达式结果
END;
LOOP 三种循环方法
LOOP
要执行的语句;
EXIT WHEN<条件语句>;–条件满足,退出循环语句
END LOOP;
例题
declare
v_num number :=1;
loop
dbms_output.put_line(‘当前num值:’ || v_num);
v_num :=v_num+1;
exit when v_num=10;
end loop;
end;
WHILE
WHILE <布尔表达式> LOOP
PL/SQL和SQL语句;
END LOOP;
例题
declare
v_num number:=1;
begin
while v_num<10 loop
dbms_output.put_line(‘当前值为:’ || v_num);
v_num:=v_num+1;
end;
FOR
FOR 循环计数器 IN [REVERSE] 下限 … 上限 LOOP
PL/SQL和SQL语句;
END LOOP;
IN每次循环加一;
IN REVERSE 每次循环减一;
EXIT 退出循环;
循环的递增只能是1,不能自定义步长
例题
declare
begin
for i in reverse 1 … 10 loop
if i=5 then
dbms_output.put_line(‘退出循环’);
exit;
end if;
dbms_output.put_line(‘当前值:’ || i);
end;