Oracle (PLSQL) [循环,游标]


条件语句 循环语句 顺序语句

一、条件控制

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 then2;
   when 条件表达式3 then3;
     ...
   else 
        默认值;
end case;
---------------------------------------------------------------------------------
case 条件表达式
  when1 then
     plsql语句1;
  when2 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;
  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值