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;