什么是 PL/SQL?
PL/SQL(Procedure Language/SQL)PLSQL 是 Oracle 对 sql 语言的过程化扩展,指在 SQL 命令语言中增加了过程处理语句(如分支、循环等),使 SQL 语言具有过程处理能力。把 SQL 语言的数据操纵能力与过程语言的数据处理能力结合起来,使得 PLSQL 面向过程但比过程语言简单、高效、灵活和实用。
范例 1:为职工涨工资,每人涨 10%的工资。
update emp set sal=sal*1.1
范例 2:例 2: 按职工的职称长工资,总裁涨 1000 元,经理涨 800 元,其他人员涨 400 元。 这样的需求我们就无法使用一条 SQL 来实现,需要借助其他程序来帮助完成,也可以使用 pl/sql。
程序语法:
declare
说明部分 (变量说明,游标申明,例外说明 〕
begin
语句序列 (DML 语句〕…
exception
例外处理语句
End;
在程序的声明阶段可以来定义常量和变量。
定义语法:
varl char(15);
Psal number(9,2);
说明变量名、数据类型和长度后用分号结束说明语句。 常量定义:married constant boolean:=true
Myname emp.ename%type;
引用型变量,即 my_name 的类型与 emp 表中 ename 列的类型一样
在 sql中使用 into 来赋值
declare
emprec emp.ename%type;
begin
select t.ename into emprec from emp t where t.empno = 7369;
dbms_output.put_line(emprec);
end;
Emprec emp%rowtype
记录变量分量的引用
emp_rec.ename:='ADAMS';
declare
p emp%rowtype;
begin
select * into p from emp t where t.empno = 7369;
dbms_output.put_line(p.ename || ' ' || p.sal);
end;
语法 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
declare
pnum number := #
begin
if pnum = 1 then
dbms_output.put_line('我是1');
end if;
end;
范例 2:如果从控制台输入 1 则输出我是 1 否则输出我不是 1
declare
mynum number := #
begin
if mynum = 1 then
dbms_output.put_line('我是1');
else
dbms_output.put_line('我不是1');
end if;
end;
范例 3:判断人的不同年龄段 18 岁以下是未成年人,18 岁以上 40 以下是成年人,40 以上是老年人
declare
mynum number := #
begin
if mynum < 18 then
dbms_output.put_line('未成年人');
elsif mynum >= 18 and mynum < 40 then
dbms_output.put_line('中年人');
elsif mynum >= 40 then
dbms_output.put_line('老年人');
end if;
end;
语法 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 的数字
declare
step number := 1;
begin
while step <= 10 loop
dbms_output.put_line(step);
step := step + 1;
end loop;
end;
范例:使用语法 2 输出 1 到 10 的数字
declare
step number := 1;
begin
loop
exit when step > 10;
dbms_output.put_line(step);
step := step + 1;
end loop;
end;
范例:使用语法 3 输出 1 到 10 的数字
declare
step number := 1;
begin
for step in 1 .. 10 loop
dbms_output.put_line(step);
end loop;
end;
在写 java 程序中有集合的概念,那么在 pl/sql 中也会用到多条记录,这时候我们就要用到游标,游标可以存储查询返回的多条数据。
语法:
CURSOR 游标名 [ (参数名 数据类型,参数名 数据类型,...)] IS SELECT 语句;
例如:
cursor c1 is select ename from emp;
注意: 上面的 pjob 必须与 emp 表中的 job 列类型一致: 定义:pjob emp.empjob%type;
范例 1:使用游标方式输出 emp 表中的员工编号和姓名
declare
cursor pc is
select * from emp;
pemp emp%rowtype;
begin
open pc;
loop
fetch pc
into pemp;
exit when pc%notfound;
dbms_output.put_line(pemp.empno || ' ' || pemp.ename);
end loop;
close pc;
end;
范例 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 的员工涨工资。
declare
cursor pc(dno myemp.deptno%type) is
select empno from myemp where deptno = dno;
pno myemp.empno%type;
begin
open pc(20);
loop
fetch pc
into pno;
exit when pc%notfound;
update myemp t set t.sal = t.sal + 1000 where t.empno = pno;
end loop;
close pc;
end;