一、什么是PL/SQL ?
PL/SQL(Procedure Language/SQL)
PL/SQL 是 Oracle 对 sql 语言的过程化扩展,指在 SQL 命令语言中增加了过程处理语句(如分支、循
环等),使 SQL 语言具有过程处理能力。把 SQL 语言的数据操纵能力与过程语言的数据处理能力结合
起来,使得 PLSQL 面向过程但比过程语言简单、高效、灵活和实用。
范例 1: 为职工涨工资,每人涨 10%的工资。update emp set sal=sal*1.1
范例 2:按职工的职称长工资,总裁涨 1000 元,经理涨 800 元,其他人员涨 400 元。
这样的需求我们就无法使用一条 SQL 来实现,需要借助其他程序来帮助完成,也可以使用 pl/sql。
pl/sql 编程语言是对 sql 语言的扩展,使得 sql 语言具有过程化编程的特性。
pl/sql 编程语言比一般的过程化编程语言,更加灵活高效。
pl/sql 编程语言主要用来编写存储过程和存储函数等。
二、pl/sql 程序语法
程序语法:
declare
说明部分 (变量说明, 游标申明,例外说明 〕
begin
语句序列 (DML 语句〕 …
exception
例外处理语句
End;
1. 常量和变量定义
在程序的声明阶段可以来定义常量和变量。
- 变量的基本类型就是 oracle 中的建表时字段的变量如 char, varchar2, date, number,
boolean, long
- 引用变量
- 记录型变量
---赋值操作可以使用:=也可以使用into查询语句赋值
declare
i number(2) := 10;
s varchar2(10) := '小明';
ena emp.ename%type;---引用型变量
emprow emp%rowtype;---记录型变量
begin
dbms_output.put_line(i);
dbms_output.put_line(s);
select ename into ena from emp where empno = 7788;
dbms_output.put_line(ena);
select * into emprow from emp where empno = 7788;
dbms_output.put_line(emprow.ename || '的工作为:' || emprow.job);
end;
2. if 分支
语法 1:
IF 条件 THEN 语句 1;
语句 2;
END IF;
语法 2:
IF 条件 THEN 语句序列 1;
ELSE 语句序列 2;
END IF;
语法 3:
IF 条件 THEN 语句;
ELSIF 语句 THEN 语句;
ELSE 语句
END IF;
- 范例 1:如果从控制台输入 1 则输出我是 1
- 范例 2: 如果从控制台输入 1 则输出我是 1 否则输出我不是 1
- 范例 3:判断人的不同年龄段 18 岁以下是未成年人, 18 岁以上 40 以下是成年人, 40 以上是老年人
---输入小于18的数字,输出未成年
---输入大于18小于40的数字,输出中年人
---输入大于40的数字,输出老年人
declare
i number(3) := ⅈ
begin
if i<18 then
dbms_output.put_line('未成年');
elsif i<40 then
dbms_output.put_line('中年人');
else
dbms_output.put_line('老年人');
end if;
end;
3. LOOP 循环语句
语法 1:
WHILE total <= 25000 LOOP
.. .
total : = total + salary;
END LOOP;
语法 2:
Loop
EXIT [when 条件];
……
End loop
语法 3:
FOR I IN 1 . . 3 LOOP
语句序列 ;
END LOOP ;
- 范例:使用语法 1 输出 1 到 10 的数字
- 范例:使用语法 2 输出 1 到 10 的数字
- 范例:使用语法 3 输出 1 到 10 的数字
---用三种方式输出1到10是个数字
---while循环
declare
i number(2) := 1;
begin
while i<11 loop
dbms_output.put_line(i);
i := i+1;
end loop;
end;
---exit循环
declare
i number(2) := 1;
begin
loop
exit when i>10;
dbms_output.put_line(i);
i := i+1;
end loop;
end;
---for循环
declare
begin
for i in 1..10 loop
dbms_output.put_line(i);
end loop;
end;
4. 游标 Cursor
在写 java 程序中有集合的概念,那么在 pl/sql 中也会用到多条记录,这时候我们就要用到游标,
游标可以存储查询返回的多条数据
- 范例 1:使用游标方式输出 emp 表中的员工编号和姓名
- 范例 2:按员工的工种涨工资,总裁 1000 元,经理涨 800 元其,他人员涨 400 元。
--备份出一张新表为 myemp;create table myemp as select * from emp;
declare
cursor pc is select * from myemp;
addsal myemp.sal%type;
pemp myemp%rowtype;
begin
open pc;
loop
fetch pc into pemp;
exit when pc%notfound;
if pemp.job = 'PRESIDENT' then addsal := 1000;
elsif pemp.job = 'MANAGER' then addsal := 800;
else addsal := 400;
end if;
update myemp t set t.sal = t.sal + addsal where t.empno = pemp.empno;
end loop;
close pc;
end;
- 范例 3:写一段 PL/SQL 程序,为部门号为 10 的员工涨工资
---游标:可以存放多个对象,多行记录。
---输出emp表中所有员工的姓名
declare
cursor c1 is select * from emp;
emprow emp%rowtype;
begin
open c1;
loop
fetch c1 into emprow;
exit when c1%notfound;
dbms_output.put_line(emprow.ename);
end loop;
close c1;
end;
-----给指定部门员工涨工资
declare
cursor c2(eno emp.deptno%type)
is select empno from emp where deptno = eno;
en emp.empno%type;
begin
open c2(10);
loop
fetch c2 into en;
exit when c2%notfound;
update emp set sal=sal+100 where empno=en;
commit;
end loop;
close c2;
end;
----查询10号部门员工信息
select * from emp where deptno = 10;