Oracle(六)PL/SQL、循环和游标

时间:2022-03-21 20:32:29

 

 Oracle(六)PL/SQL、循环和游标

 

-- View:视图(虚表),不占用物理空间!
--  如果没有权限
-- 使用dba登录  grant  create any  view to 用户名;

create or replace  view  teacher_view
as
select tname,sal from teacher

--  查询视图
select * from teacher_view

************=======PL/SQL=======*************

 

--PL/SQL (Procedural  Language) 过程化sql语言! 在原本的sql语句上 添加了 逻辑判断
--循环等操作!   在数据库 执行pl/sql程序时,pl/sql和sql语句时分别进行解析和执行的!

--语法结构     :=  就是赋值语句
--01.declare   可选部分  声明 : 变量, 异常,游标...

--02.begin     必要部分   书写:sql语句 和pl/sql语句

--03.exception  可选部分   针对出现异常时候的处理

--04.end       必要部分


-- 根据指定老师的编号查询薪水  输出一个结果
declare
  v_name  teacher.tname%type;
  v_sal   teacher.sal%type;
  v_result  varchar2(30);
begin
    select t.tname,t.sal into v_name,v_sal from teacher t where  tno=1002;
   --根据薪水   得到不同的返回结果
    if v_sal>=2000 and v_sal<=10000 then
      v_result:='还可以吧';
    elsif v_sal>10000 and v_sal<=40000 then
      v_result:='真可以';
    elsif v_sal>40000 then
      v_result:='牛牛牛';
    else
       v_result:='咩咩';
    end if;
      dbms_output.put_line(v_name||':'||v_sal||'====='||v_result);
   
    --根据 v_result的值 输出不同的结果
    case v_result
      when '还可以吧' then
         dbms_output.put_line(v_name||'工资在2k到10k');
      when  '真可以' then
          dbms_output.put_line(v_name||'工资在10k到40k');
      when '牛牛牛' then
         dbms_output.put_line(v_name||'工资在40k以上');
        else
             dbms_output.put_line(v_name||'工资2k以下');
      end case
    
end;

************=======循环=======*************

--循环结构
--01.loop 语法
   loop
     执行的语句;
     exit when 条件;
   end loop;
  

declare
i number;
begin
  i:=1;
  loop
    dbms_output.put_line(i);
    i:=i+1;
    exit when i>50;
   end loop;
end;
   
--02.while  语法
  while 条件  loop
   执行的语句;
  end loop;

declare
i number;
begin
  i:=1;
  while i<=50 loop
    dbms_output.put_line(i);
    i:=i+1
   end loop;
end;


--03.for 语法

for 变量 in  范围(上限,下限)loop
  执行的语句;
end loop;

declare
i number;
begin
for i in 1..50
   loop
    dbms_output.put_line(i);
   end loop;
end;

************=======游标=======*************

--游标:是系统给我们用户 开设一个数据缓冲区! 存放的是sql语句执行的结果!
--每个游标区都有一个名字,用户通过游标一行一行的获取记录!

--01.隐式游标  在我们Pl/sql中,程序执行sql语句时 自动创建! ====>sql
--02.显示游标  可以返回多行的查询!
--03.REF游标   用于处理运行时才能确定的动态sql 查询结果

--隐式游标属性
   --01.sql%found   影响了一行或者多行 都返回 true
   --02.sql%notfound   没有影响行数   返回 true
   --03.sql%rowcount    sql语句影响的行数
   --04.sql%isopen    游标是否打开,始终为false
declare
tname  teacher.tname%type; --声明一个变量
  cursor teacher_cursor  is  select tname from teacher; --声明游标
begin
   open teacher_cursor;  --打开游标
    fetch teacher_cursor into tname;
   --循环输出tname
   while teacher_cursor%found
     loop
       dbms_output.put_line('教师的姓名===='||tname);
       fetch teacher_cursor into tname;
     end loop;
   close teacher_cursor;--关闭游标
end;