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;
posted @ 2020-12-08 18:58  发光的皮卡丘  阅读(87)  评论(0)    收藏  举报