plsql程序设计详解(二)

九:循环语句

一共有三种循环方式
oracle中没有自增++ ;
自身=自身+1即可

WHILE 条件 LOOP … END LOOP;
LOOP EXIT WHEN 条件 … END LOOP;
FOR I IN 1..5 (必须为连续区间)LOOP … ;END LOOP;

例1:

--while循环打印数字的1~10

set serveroutput on
declare

--定义循环变量

pnum number := 1;
begin
while pnum <=10 loop

 --循环体

dbms_output.put_line(pnum);
--使该变量+1

pnum := pnum+1;
end loop;
end;
/

例2:

--loop循环打印数字的1~10(推荐)
set srveroutput on 
declare
  --定义循环变量
  pnum number:=1;
  begin
  loop
    --退出条件
    exit when pnum>0;
    --打印该变量的值
     dbms_output.put_line(pnum); 
    --循环变量+1
    pnum:=pnum+1;
  end loop;
end;
/

例3:

--for循环打印数字1~10
set serveroutput on
declare
  --定义循环变量
  pnum number:=1;
  begin
  for pnum in 1..10 loop   --表示从1到10连续的区间
    --循环体
    dbms_output.put_line(pnum);
  end loop;
end;
/

三种循环,建议使用第二种循环,因为第二种在控制光标的时候会比较方便

十:光标

光标(游标):就是一个结果集(Result Set)
不能把一个集合赋值给一个基本型变量

光标的语法:
cursor 光标名[(参数名 数据类型[,参数名 数据类型]…)] is select 语句;
例:cursor c1 select ename from emp;
打开光标:open c1;
注:就是执行select语句,将结果集给c1
关闭光标:close c1;
取出一行光标的值:fetch c1 into pename;(取一行到变量中)

fetch 的作用:1)把当前指针指向的记录返回
             2)将指针指向下一条记录

光标属性:%found %notfound 值有true与false
例:

--查询并打印员工的姓名薪水
set serveroutput on
DECLARE 
--定义游标
  cursor cemp is select ename, sal from emp;
  --使用引用型变量,为光标定义对应的变量
  pename emp.ename%type;
  psal emp.sal%type;
  begin
  --打开游标
  open cemp;
  loop
    fetch cemp into pename, psal;   --取一条记录
    exit when cemp%notfound;        --没有取到记录退出。
    dbms_output.put_line(pename || '的薪水是' || psal);
  end loop;
  --关闭游标
  close cemp;
end;
/

十一:练习

--给员工涨工资,总裁1000,经理800,其他400
set serveroutput on 
declare
  cursor cemp is select empno,ename,empjob,sal from emp;
  pempno emp.empno%type;
  pempjob emp.empjob%type;
  psal emp.sal%type;
  pename emp.ename%type;
  begin
  --把之前涨的工资回退回去
   rollback;
   open cemp;
    loop 
    --取出一个员工
      fetch cemp into pempno,pename,pempjob,psal;
      exit when cemp%notfound;
      --判断是什么职位
      if pempjob = 'PRESIDENT' then update emp  set sal=sal+1000 where empno=pempno; 
      elsif pempjob = 'MANAGER' then update emp set sal=sal+800  where empno=pempno; 
      else update emp set sal=sal+400 where empno=pempno;
      end if;

    end loop;
   close cemp;
   --对于Oracle默认的事务隔离级别是read committed
   --事务的ACID即原子性、一致性、隔离性、持久性
   commit;
   DBMS_OUTPUT.PUT_LINE('修改完成');
   open cemp;
    loop 
      fetch cemp into pempno,pename,pempjob,psal;
      exit when cemp%notfound;
      DBMS_OUTPUT.PUT_LINE(pename||'的薪水是'||psal);
    end loop;
  close cemp;
end;
/

十二:光标的属性与限制
1光标的属性
%found %notfound
%isopen : 判断光标是否打开
%rowcount : 影响的行数
2.光标数的限制:默认情况下,oracle数据库只允许在同一个会话中,打开300个光标

>--切换到管理员,查看数据库初始化设置   
>show user
>conn sys/password@127.0.0.1:1521/orcl as sysdba
>show parameter cursor

修改光标数的限制:
alter system set open_cursors=400 scope=both;
scope是范围的意思,它的取值有:both(两个同时更改),memory(只更改当前实例,不更改参数文件),spfile(只更改参数文件,不更改当前文件,数据库需要重启)

  if cemp%isopen then
  dbms_output.put_line('光标已经打开');
  end if;

  loop
   --取出一条记录 
  fetch cemp into pempno,pjob;
  exit when cemp%notfound;
   --打印rowcount的值
  dbms_output.put_line('rowcount'||cemp%rowcount);
  end loop;

十三:带参数的光标

(1)光标就是一个结果集(Result Set)
(2)光标的语法:
cursor 光标名[(参数名 数据类型[,参数名 数据类型]…)]
IS SELECT 语句;
cursor c1 is select ename from emp;

--查询某个部门中员工的姓名
set serveroutput on

declare
  --定义带参数的光标
  cursor cemp(dno number) is select ename from emp where     deptno=dno;
  begin
  open cemp(10);
  loop
    fetch cemp into penae;
    exit when cemp%notfound;
    dbms_output.put_line(pename);
  end loop;
  close cemp;
end;
/
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值