条件语句 循环语句 顺序语句
一、条件控制
IF 语句
if 条件表达式1 then
plsql语句1;
elsif 条件表达式2 then
plsql语句2;
...
elsif 条件表达式n then
plsql语句n;
else
plsql语句;
end if;
----------------例子-------------------------
declare
--声名一个变量用来存放从键盘输入的值
a varchar2(20);
begin
--从键盘输入一个颜色字符串存入变量a
a:='&请输入一个颜色';
if a ='green' then
dbms_output.put_line('它是绿色');
elif a ='bule' then
dbms_output.put_line('它是蓝色');
else
dbms_output.put_line('其它颜色');
end if;
end;
CASE 语句
case
when 条件表达式1 then
plsql命令 值1;
when 条件表达式2 then
值2;
when 条件表达式3 then
值3;
...
else
默认值;
end case;
---------------------------------------------------------------------------------
case 条件表达式
when 值1 then
plsql语句1;
when 值2 then
plsql语句2;
...
when 值n then
plsql语句n;
else
plsql语句;
end case;
----------------------例子-----------------------------
declare
--声名一个变量用来存放从键盘输入的值
a varchar2(20);
begin
a:='&请输入一个颜色';
case a
when 'green' then
dbms_output.put_line('它是绿色');
when 'bule' then
dbms_output.put_line('它是蓝色');
else
dbms_output.put_line('其它颜色');
end case;
end;
二、循环
LOOP - 无条件循环
WHILE - 根据条件循环
FOR - 循环固定的次数
exit when: 如果条件成立立即退出循环
continue: 退出本次循环,不会结束循环
return: 退出程序,结束整个程序
LOOP
loop
plsql语句;
exit when 退出循环条件;
循环控制语句;
end loop;
---------------------循环打印1到9------------------------------
declare
--声名一个变量,用来存放一个数字,(循环变量)
n number(10); --可以在此处赋值
begin
--给循环变量赋值为1
n:=1;
--循环语句
loop
--循环体执行的plsql语句
dbms_output.put_line(n);
--退出循环条件
exit when n=9;
--改变循环变量的值,保证循环不会死循环(循环控制语句)
n := n+1;
end loop;
end;
WHILE 循环
while 循环条件 loop
循环体;
迭代条件;
end loop;
------------------循环打印1到9------------------------------
declare
--声名一个变量,来控制循环
n number(10);
begin
--给循环变量赋值
n:=1;
--while循环语句
while n <10 loop --循环条件
--循环体语句(打印数字)
dbms_output.put_line(n); --循环体
--循环控制语句
n := n+1; --迭代条件
end loop;
end;
FOR
for 循环变量 in 集合|查询语句|游标变量 loop
循环体语句;
end loop;
-------------循环打印1到9---------------------------------------------------------
begin
for i in 1..9 loop
--循环体语句
dbms_output.put_line(i);
end loop;
end;
--------------------------------
--------------循环打印a表中的id信息---------------------------------------------
begin
for aa in (select * from a where id=&id) loop
--循环体语句,打印部门信息
dbms_output.put_line(aa.id||'---'||aa.name);
end loop;
end;
-------------------------------------------------
select into
select 列名,列名 into 变量1,变量n --record变量|rowtype变量
from 表名 where 条件;
顺序控制
顺序控制用于按顺序执行语句
GOTO 语句-----无条件地转到标签指定的语句
NULL 语句-------什么也不做的空语句,就是占位置
GOTO 语句
<<lable>>
循环执行的plsql语句;
if 条件 then
goto lable;
end if;
<<>>:标签定义符
lable:标签名,符合标识符命名规范
goto语句:程序回到标签处执行
--------循环打印1到9------------------------------------------------------
declare
v_n number(10):=1;
begin
<<mylable>>
dbms_output.put_line(''||v_n);
v_n:=v_n+1;
if v_n<10 then
goto mylable;
end if;
end;
三、游标
概念
执行增删改查的时候,Oracle会开辟一块空间,用来暂时存放受到影响的数据,借助游标来操作这些数据
它实际上是一个指针,它在一段Oracle存放数据查询结果集或数据操作结果集的内存中(数据的缓存区),游标就是指向这个缓冲区的一个指针
缺点:占内存,会上锁
执行流程
声明==>打开==> 取出==> 判断==> 关闭
类型
1,隐式游标:在 PL/SQL 程序中执行DML SQL 语句时自动创建隐式游标,名字固定叫sql。
2,显式游标:显式游标用于处理返回多行的查询。
3,REF 游标:REF 游标用于处理运行时才能确定的动态 SQL 查询的结果
属性
%found: 是否有数据
返回一个布尔类型的值,
--如果游标指向的数据不为空,那么返回true,否则返回false
%notfound:和%found相反
--boolean布尔类型:true,false,null
%rowcount: 受到影响的行数
--它可以表示游标指向的缓冲区(结果集)的数据条数
%isopen: 游标是否打开
返回一个布尔类型的值,
--判断当前游标是否打开,如果是打开的返回true,否则返回false
显式游标
可以用于暂存查询取出的多行结果,一行一行显示
查询多条数据
按行处理查询的多好结果
就是自己定义的游标=自定义游标
1,游标变量的声明
cursor 游标名 is select语句;
2,打开游标
open 游标名称;
3,当前游标指向下一条数据并把数据保存在一个变量中--fetch into
fetch 游标变量 into 变量
4,关闭游标
close 游标名称
--------使用游标打印所有信息--------------------------------
loop循环
declare
cursor c_a is select * from a;
--声名一个a%rowtype类型的变量用来保存游标中的一条记录
v_a a%rowtype;
begin
--打开游标
open c_a;
--遍历游标
loop
--fetch into游标指向下一条数据,并保存数据到变量v_a中
fetch c_a into v_a;
--判断游标是否还有数据,如果没有数据,就退出循环
exit when c_a%notfound;
--把这条员工信息打印出来
dbms_output.put_line(v_a.name||','||v_a.job||','||v_a.sal||','||v_a.id);
end loop;
--关闭游标
close c_a;
end;
---------------------------------------
while循环
declare
--声名一个游标变量指向所有信息的集合
cursor c_a is select * from a;
--声名一个变量用来保存游标的一条记录
v_a a%rowtype;
begin
--打开游标
open c_a;
--执行一次fetch into 让游标指向第一条数据
fetch c_a into v_a;
--while循环,条件是循环条件
while c_a%found loop
dbms_output.put_line(v_a.name||','||v_a.job||','||v_a.sal||','||v_a.id);
--fetch into将游标指向下一条数据
fetch c_a into v_a;
end loop;
dbms_output.put_line(c_emp%rowcount||'');
--关闭游标
close c_a;
end;
---------------------------------------
for循环
自动打开游标、关闭游标,并且自动会让游标指向一条记录
declare
--声名一个游标变量指向所有员工的集合
cursor c_a is select * from a;
begin
for v_a in c_a loop
dbms_output.put_line(v_a.name||','||v_a.job||','||v_a.sal||','||v_a.id);
end loop;
end;
带参数
cursor 游标名(参数名 数据类型..) is select 语句;
open 游标名(参数,参数..);
---------------------------------------------
输入一个id,打印该id信息
declare
cursor c_a(v_id a.id%type) is select * from a where id=v_id;
--声名一个变量来接收
v_a a%rowtype;
begin
--打开游标
open c_a(1);--参数 id为1
loop
fetch c_a into v_a;
--判断游标当前数据是否为空,如果为空退出循环
exit when c_a%notfound;
dbms_output.put_line(v_a.name||','||v_a.job||','||v_a.sal||','||v_a.id);
end loop;
--关闭游标
close c_emp;
--for v in c_a(1) loop
--dbms_output.put_line(v_a.name||','||v_a.job||','||v_a.sal||','||v_a.id);
--end loop;
end;
---------使用显式游标更新行---------------
for update
where current of 游标名
--只删除修改游标里的内容
-----------------------
declare
v_emp emp%rowtype; --接收变量
cursor mycursor is select * from emp where deptno = 66 for update;--for update 要对游标进行删改
begin
open mycursor;
fetch mycursor into v_emp;
while mycursor%found loop
--where current of游标名; 对游标读取的所在行进行更新和删除
update emp set ename = 'tom' where current of mycursor;
--delete emp where current of mycursor;
fetch mycursor into v_emp;
end loop;
close mycursor;
end;
隐式游标
执行DML语句时自动创建隐式游标
没有打开关闭
前缀名SQL
SQL
%FOUND 影响了一行或多行时为 TRUE
%NOTFOUND 没有影响任何行时为TRUE
%ROWCOUNT 影响的行数
%ISOPEN 游标是否打开,始终为FALSE
declare
v_a a%rowtype;
begin
update a set name='张三' where id=&id;
dbms_output.put_line('修改的数据条数:'||sql%rowcount); --SQL 语句影响的行数
if sql%found then
dbms_output.put_line('aaaaaaaaaaaaaaa');
end if;
delete from a where id=&id;
dbms_output.put_line('删除了'||sql%rowcount||'条数据');
end;
显式游标和隐式游标的区别
1,调用隐式游标的时候,通过SQL前缀调用。
显式游标都是有自己的名字,调用时通过名字当做前缀调用。
2,显式游标可以自定义,隐式游标是执行DML语句时自动创建。
3,显游游标需要手动打开关闭,隐式游标没有。
REF游标
REF 游标和游标变量用于处理运行时动态执行的 SQL 查询
1.声明 REF 游标类型
type 类型名称 is ref cursor;
2.声明 REF 游标类型的变量
变量名称 游标变量类型;
使用:open 游标变量 for select 语句;
---------------------------
ref游标只有打开的时候才会被赋值
for循环自动打开关闭不能用
---------------------------------------------
declare
--声明 REF 游标类型
type c_type is ref cursor;
--声名REF游标类型变量
v_cur c_type;
v_a a%rowtype;
begin
open cur for select * from a; --赋值游标
loop
fetch cur into v_a;
exit when cur%notfound;
dbms_output.put_line(v_a.name);
end loop;
close cur;
end;