PL/SQL基础

原创
2018/11/20 21:08
阅读数 17

一、PL/SQL基础和变量类型

1、PL/SQL的程序结构

declare
   说明部分(变量说明、光标声明、例外说明)
begin
   语句序列(DML语句)
exception
   例外处理语句
end;
/

2、PL/SQL变量基本类型

基本类型:   
        char、varchar2、date、number、boolean、long

举例:
    var1 char(15);
    married boolean:=true;
    psal number(7,2);

3、引用类型变量

  -- 引用类型变量
declare
  -- 定义引用类型变量:查询并打印7839的姓名和薪水
  pename emp.ename%type;
  psal emp.sal%type;
begin
  -- 等到7839的姓名和薪水
  select ename,sal into pename ,psal from emp where empno=7839;
  
  -- 答应姓名和薪水
  dbms_output.put_line(pename || '的薪水' || psal);

end;
/

4、记录型变量(代表某个表的一行记录)

-- 记录型变量

-- 举例:
        emp_rec emp%rowtype;

-- 记录型变量分量的引用
        emp_rec.ename :='adams';
  

二、PL/SQL (if)分支结构

1、if语句

-- 结构
if 条件 then 语句1;
   语句2;
end if;

2、if-else 语句

if 条件 then 语句序列1;

esle 语句序列2;

end if;

3、if -elsif-else 语句

if 条件 then 语句;

elsif 条件 then 语句;

else 语句;

end if;

4、PL/SQL if-elsif-else 的使用demo

/*
 判断用户从键盘输入的数字
 1.如何使用if语句
 2.接收一个键盘输入(字符串)
*/
-- 接收一个键盘输入
-- num:地址值,含义是:在该地址上保存了输入的值
accept num prompt '请输入一个数字';

declare
 -- 定义变量保存用户从键盘输入的数字
  pnum number:=#

begin

 -- 执行if语句进行条件判断 
 if pnum=0 then dbms_output.put_line('你输入数字是0');
  elsif pnum=1 then dbms_output.put_line('你输入的数字是1');
  elsif pnum=2 then dbms_output.put_line('你输入的数字是2');
  else dbms_output.put_line('其他数字');
 end if;

end;
/

三、PL/SQL 循环语句

1、while循环

while 条件 loop
 --条件满足时执行语句块

 语句块;

end loop;

2、while循环demo

declare
  -- 定义循环变量
  pnum number:=1;
begin
  
  while pnum<=10 loop
    -- 循环体
    dbms_output.put_line(pnum);
    
    -- 使该变量+1
    pnum:=pnum+1;
  end loop;

end;
/ 

3、loop循环(exit[when 条件] 和 while 循环取反的关系)

loop
  exit[when 条件];
  --循环体

end loop;

4、loop循环demo

--使用loop循环打印1~10
declare
 -- 定义循环变量
 pnum number:=1;
begin
  loop

    -- 退出条件:循环变量大于10
    exit when pnum>10;
    
     -- 打印该变量的值
     dbms_output.put_line(pnum);    
    
     -- 循环变量+1
     pnum:=pnum+1;

  end loop;
end;
/

5、for 循环语句

for i in 1..3 loop
  语句序列;
end loop;

四、PL/SQL 光标

1、光标:就是一个结果集

2、定义光标

-- 定义一个具体的光标
cursor c1 is select ename from emp;

3、光标操作

-- 光标在使用前:
-- 1、打开光标: open c1;
-- 2、操作光标(取一行光标的值,赋给pename):fetch c1 into pename;
-- 3、关闭光标:close c1;

-- 注:fetch的作用:
              --  把当前指针指向的记录返回
              --  将指针指向下一条记录
   
   

4、光标的属性

%found :能取到光标的值
%notfound :不能取到光标中的值
%isopen  : 判断光标是否打开
%rowcount : 操作光标时,影响光标的行数

5、光标遍历打印员工的薪水demo

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;
/

6、采用光标给员工涨工资

-- 给员工涨工资,总裁1000,经理800,其他400
/*
  需求分析:
  1、首先要获取所有的员工-->是光标-->循环遍历-->退出条件
  cursor cemp is select empno,empjob from emp;
  2、根据员工的职位给员工涨工资
  
*/
declare
  -- 定义一个光标,返回员工编号和员工职位
  cursor cemp is select empno,empjob from emp;
  -- 定义两个变量保存员工编号和员工职位
  cempno emp.empno%typ;
  cempjob emp.empjob%typ;
begin
 -- 打开光标
 open cemp;
   --遍历光标
   loop
     -- 从光标中取出一行数据
     fetch cemp into cempno,cempjob;
     --退出条件     
     exit when cemp%notfound
     -- 执行循环体
     if cempjob = '总裁' then
       update emp set sal = sal+1000 where empno =cempno;
     elsif cempjob = '经理'
       update emp set sal = sal+800 where empno =cempno;
     else 
       update emp set sal = sal+400 where empno =cempno;
     end if;
   end loop; 

 -- 关闭光标
 close cemp;
 -- 提交事务
 commit;
end;
/

7、光标的限制数

-- 光标的限制数,默认情况下,oracle数据库只允许在同一个会话中,打开300个光标
-- 查看光爆数
 SQL>show parameter cursor

 open_cursors integer 300

-- 修改光标数的限制
alter system set open_cursors=400 scope=both;

-- scope的取值:both、memory、spfile(数据库需要重启)

8、带参数的光标

-- 查询某个部门中员工的姓名
declare 
 -- 定义带参数的光标
 cursor cemp(dno number) is select ename from emp where deptno=dno;
 name emp.ename%type;
begin
 -- 打开光标,传入参数,查询20号部门的员工
 open cemp(20);
  
  -- 遍历光标
  loop
    -- 取出一条数据
    fetch cemp into name;
    -- 循环退出条件
    exit when cemp%notfound;
 
     dbms_output.put_line(name);

  end loop; 


 -- 关闭光标
 close cemp;
end;
/

五、PL/SQL 例外

1、oracle中的例外类型

-- oracle中的例外类型
-- 系统例外
-- 自定义例外

2、oracle 中的常见系统例外:

-- oracle 中的常见系统例外:

-- No_data_found (没有找到数据)

-- Too_many_rows (select ...into语句匹配多个行)

-- Zero_Divide (被零除)

-- Value_error (算术或转换错误)

-- Timeout_on_resource (在等待资源时发生超时)

3、系统例外使用 demo

-- 系统例外:no_data_found
declare
  pename emp.ename%type;
begin
  -- 查询员工号是1234的员工姓名
  select ename into pename from emp where empno=1234;
exception
  when no_data_found then dbms_output.put_line('没有找到该员工');
  when others then dbms_output.put_line('其他例外');
end;
/

4、自定义例外

定义变量、类型时exception
使用 raise 抛出自定义例外

5、自定义例外demo

-- 自定义例外:查询50号部门的员工姓名
declare
 -- 定义光标,代表50号部门的员工姓名
 cursor cemp is select ename from emp where deptno=50;
 name emp.ename%type;

 --自定义例外
 not_emp_found exception;

begin

 -- 打开光标
 open cemp;
 
  -- 直接取一个员工的姓名
 fetch cemp into name; 

 -- 关闭光标 
 close cemp;
  
exception
 when not_emp_found  then dbms_output.put_line('没有找到员工');
 when others then dbms_output.put_line('其他例外');
end;
/

 

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部