PLSQL学习笔记
简介
PL/SQL 是一种过程化语言,属于第三代语言,他与C、C+、JAVA等语言一样关注于处理细节,可以用来实现比较复杂的业务逻辑,它允许Sql的数据操纵语言和查询语句包含在块结构和代码过程语言中,使PL/SQL成为一个强大的事务处理语言。主要用于数据库
基本格式
--例子一
declare
str varchar(50):='Hello PLSQL 哥来了';
begin
dbms_output.put_line(str); -- 输出使用
end;
--例子二
-- 查询出7499号员工工资
-- 自定义变量容易出错
declare
vsal number(6,2);
vempno number(4):=7499;
begin
-- 查询出来的sal into表示赋值 给vsal变量
select sal into vsal from emo where empno=vempno;
dbms_output.put_line('7499号员工工资为:'||vsal); -- ||为连接符号
end;
-- 建议使用应用数据库表中对应的字段属性
declare
vsal emp.sal%type;
vempno emp.empno%type:=7499;
begin
-- 查询出来的sal into表示赋值 给vsal变量
select sal into vsal from emo where empno=vempno;
dbms_output.put_line('7499号员工工资为:'||vsal); -- ||为连接符号
end;
自定义record 与rowtype的使用
declare
type emp_record is record(
vempno emp.empno%type,
vename emp.empno%type,
vsal emp.sal%type,
vdeptno emp.deptno%type
);
vemp emp_record; -- 定义记录类型的变量
begin
--查询出一组对象,对位保存在记录类型中
select empno,ename,sal,deptno into vemp from where empno = 7499;
dbms_output.put_line('员工编号为:'||vemp.vempno||'姓名为:'||vemp。vename);
end;
-- 应用表类型为记录类型,上面的进化版
declare
vemp emp%rowtype;
begin
--查询出一组对象,对位保存在记录类型中
select * into vemp from where empno = 7499;
dbms_output.put_line('员工编号为:'||vemp.empno||'姓名为:'||vemp.ename);
end;
条件使用
--if....then.....elseif......then......else......end if;
--例子
--要求:查询出7499号员工工资,若大于或等于1000 打印'salary >= 1000';
--若在500 到1000 那么打印'500<=salary<1000';
--否则打印'salary< 500';
declare
vemp emp%rowtype;
vstr varchar(50);
begin
select * into vemp from where empno=7499;
if vemp.sal >= 1000 then
vstr:='salary >= 1000';
elseif vemp.sal>=500 then
vstr:='500<=salary<1000';
else
vstr:='salary< 500';
end if;
dbms_output.put_line(vstr);
end;
选择结构使用
-- 3种写法 具体 case....when....then...when....then.....else.....end/end case
--输入数字,等于100,输出A++ 大于90输出A 大于80输出B 否则C
--第一种 这种写法,只能输入100,90,80 因为vscore/10是带小数点后的,不是整除
declare
vscore number(5):=&scoure; --&键盘输入
vstr varchar(50);
begin
vstr:=
case vscore/10 when 10 then
'A++'
when 9 then
'A'
when 8 then
'B'
else
'C'
end;
dbms_output.put_line(vstr);
end;
--第二种比较复杂
declare
vscore number(5):=&scoure; --&键盘输入
vstr varchar(50);
begin
case vscore/10 when 10 then
vstr:='A++';
when 9 then
vstr:='A';
when 8 then
vstr:='B';
else
vstr:='C';
end case;
dbms_output.put_line(vstr);
end;
--第三种
declare
vscore number(5):=&scoure; --&键盘输入
vstr varchar(50);
begin
vstr:=
case when vscore = 10 then
'A++'
when vscore >= 90 then
'A'
when vscore >= 80 then
'B'
else
'C'
end;
dbms_output.put_line(vstr);
end;
循环结构使用
--三种循环
--第一种类似JAVA种的do....while
-- loop 循环体 exit when 退出条件 迭代 end loop
-- 例子
declare
vi number(5) :=1;
begin
loop
--循环体
dbms_output.put_line(vi||'好好学习,天天向上!');
--退出条件
exit when vi=100;
--迭代
vi := vi+1;
end loop;
end;
--第二种类似于JAVA种的while
-- while 退出条件 loop 循环体 迭代 end loop
declare
vi number(5) := 1;
begin
while vi<=100 loop
dbms_output.put_line(vi||'好好学习,天天向上!');
vi := vi+1;
end loop;
end;
--第三种for循环
-- for 变量 in 下限 .. 上限 loop 循环体 end loop
declare
begin
for vi in 1 .. 100 loop
dbms_output.put_line(vi||'好好学习,天天向上!');
end loop;
end;
goto使用
-- gooto 位置 <<跳到的位置>>
declare
vi number(5) :=1;
begin
loop
--循环体
dbms_output.put_line(vi||'好好学习,天天向上!');
if vi = 50 then
goto break;
end if;
--退出条件
exit when vi=100;
--迭代
vi := vi+1;
end loop;
<<break>>
dbms_output.put_line('循环结束!');
end;
游标
--1.定义/生明游标 2.打开游标 3.提取游标数据 4.关闭游标
--显示游标 隐式游标
--一般查询使用的都是显示游标
--概念:查询内容后,系统会提供一块区域保存数据,有一个指针指向该空间,这就式游标
--无参游标
declare
vsal number(6,2);
--1.声明游标
cursor emp_cur is select sal from emp;
--2.打开游标
begin
open emp_cur;
--3.提取游标
fetch emp_cur into vsal;
while emp_cur%found loop
dbms_output.put_line('员工工资为:'||vsal);
fetch emp_cur into vsal;
end loop;
--4.关闭游标
close emp_cur;
end;
-- 带参游标
--查询30号部门所有员工
declare
vemp emp%rowtype;
cursor emp_cur(deptno number) is select * from where deptno = vdeptno;
begin
open emp_cur(30);
loop
fetch emp_cur into vemp;
exit when emp_cur%notfound;
dbms_output.put_line('员工编号为:'||vemp.empno||"员工姓名:"||vemp.ename);
end loop;
close cursor;
end;
--带返回值游标 一般不用
--查询30号部门所有员工
declare
vemp emp%rowtype;
cursor emp_cur(deptno number)
return emp%rowtype --设置游标返回值类型后,只能查询出对应类型
is select * from where deptno = vdeptno;
begin
open emp_cur(30);
loop
fetch emp_cur into vemp;
exit when emp_cur%notfound;
dbms_output.put_line('员工编号为:'||vemp.empno||"员工姓名:"||vemp.ename);
end loop;
close cursor;
end;
--进化版 for循环查询游标,执行查询出30号部门所有员工信息
declare
cursor emp_cur(vdeptno number) is select * from where deptno = vdeptno;
begin
for vemp in emp_cur(30) loop
dbms_output.put_line('员工编号为:'||vemp.empno||"员工姓名:"||vemp.ename);
end loop;
end;
--再次进化版
begin
for vemp in (select * from emp where deptno = 30) loop
dbms_output.put_line('员工编号为:'||vemp.empno||"员工姓名:"||vemp.ename);
end loop;
end;
-- 隐式游标
-- 新增一个部门,如果该部门新增成功就为其设置办公地址,最后查询出结果
declare
vdept dept%rowtype;
begin
insert into dept values(50,upper('logistics'),null);
if sql%rowcount >0 then
update dept set loc= '广东广州' where deptno = 50;
if sql%rowcount > 0 then
dbms_output.put_line('部门编号为:'||dept.deptno||"地址:"||dept.deptno);
end if;
end if;
end;
-- 游标本身是不可重复打开的
-- 游标变量
-- 游标变量在开启时才指定空间
--关闭游标后还可以重新指定空间
declare
--1.声明游标变量,采用系统提供的游标
vcur sys_refcursor;
vemp emp%rowtype;
vdept dept%rowtype;
--2.开启游标并指定空间for赋值
begin
open vcur into vemp;
loop
--3.提取游标
fetch vcur into vemp;
exit when vcur%nofount;
dbms_output.put_line('员工编号为:'||vemp.empno||"员工姓名:"||vemp.ename);
end loop;
--4.关闭游标
close vcur;
--2.开启游标并指定空间for赋值
open vcur into vdept;
loop
--3.提取游标
fetch vcur into vdept;
exit when vcur%nofount;
dbms_output.put_line('部门编号为:'||dept.deptno||"地址:"||dept.deptno);
end loop;
--4.关闭游标
close vcur;
end;

浙公网安备 33010602011771号