• PL/SQL结构


    1. 输入两个数值,输出对应的和
    declare
    num1 number;
    num2 number;
    sum1 number; 
    begin
      num1:='&请输入第一个:';
      num2:='&请输入第二个:';
      sum1:=num1+num2;---->赋值的时候前面记得加冒号
      dbms_output.put_line('两数之和'||sum1);--->注意PL/SQL里面是用的||来进行数字和字符串的连接,而不是+
    end;
    1. 输入员工编号查询视图v_emp_dept表中,–(dname,ename,job,hiredate,sal)数据
      这里我们需要先建立一个视图,但是我建立的时候遇到了权限不够,这里我们可以登陆DBA的账户里面采用grant dba to scott;赋予scott以DBA权限
    create or replace view v_emp_dept as 
    select empno,ename,job,hiredate,sal,dname from emp,dept where emp.deptno=dept.deptno
    这里我们在创建视图的时候添加一个or replace 就可以进行多次执行该语句
    或者我们还可以通过join来进行创建
    
    create or replace view v_emp_dept as
     select empno,ename,job,hiredate,sal,dname from emp join dept on emp.deptno=dept.deptno ;

    我们利用select * from v_emp_dept;对创建的视图进行查询
    这里写图片描述
    接下来我们就要利用PL/SQL结构对该视图进行查询
    那么我们需要定义对应的 变量将所要查询的字段 赋值给对应的变量
    然后输出我们定义的变量,这里我们不能够直接输出视图里面的字段,而是要输出变量

    declare 
    e_no emp.empno%type;
    d_name dept.dname%type;
    e_name emp.ename%type;
    e_job emp.job%type;
    e_hiredate emp.hiredate%type;
    e_sal emp.sal%type;
    begin
      e_no:='&请输入员工编号:';
      --接下来将所要输出的字段赋值给我们定义的变量,使用的是select...into...的方法进行赋值
      select dname,ename,job,hiredate,sal into d_name,e_name,e_job,e_hiredate,e_sal 
      from v_emp_dept
      where e_no=empno;---->注意这里需要以分号结尾表示一个完整的select语句
      并且还要记得有一个where的控制条件查询的是哪个员工的信息
      dbms_output.put_line('部门名称:'||d_name||'员工姓名'||e_name||'岗位'||e_job||'入职日期'||e_sal||'薪水') ;---->字段之间的连接都要用||
    end;

    这里写图片描述
    我们查询员工编号为7788的信息
    这里写图片描述
    但是这种对每一个输出的变量进行赋值的方法太麻烦了,我们可以通过整个表直接赋值,将新定义的表的类型和原来的视图的类型一致

    declare
    e_view v_emp_dept%rowtype;
    --新定义一个视图的表,类型和原来的视图一模一样
    begin
      e_view.empno:='&请输入员工的编号:';
      --->这里由于e_view和v_emp_dept一模一样,所以可以直接将v_emp_dept的所有字段直接赋值给新视图e_view  同样要注意where条件
      select * into e_view  from v_emp_dept where e_view.empno=empno;
      dbms_output.put_line('部门名称:'||e_view.dname||'员工姓名'||e_view.ename||'岗位'||e_view.job||'入职日期'||e_view.hiredate||'薪水'||e_view.sal) ; ---->输出的时候实际上输出的是新视图的各个字段
    end;
    这里我们利用to_char 将日期的格式转换为标准的格式
    to_char(e_view.hiredate,'YYYY-MM-DD')

    这里写图片描述

    1. 分支语句
    declare 
    score number:='&请输入成绩:';
    begin
      if score<60 then 
        dbms_output.put_line('差');
      elsif score<70 then--->注意这里不是elseif而是elsif
        dbms_output.put_line('中');
      elsif score<80 then
        dbms_output.put_line('良');
      elsif score<90 then
        dbms_output.put_line('优');
      else dbms_output.put_line('非常优秀');
      end if;----->一定注意有结束if的语句
    end;
    1. 循环输出1…100之间的所有奇数
      LP/SQL结构中有三种循环:
      –循环
      –loop循环(相当于do…while…=loop….exit when …..end loop;)
      begin
      loop
      循环体
      exit when 结束条件
      end loop;
      end;
      –while loop 循环相当于while…do….=while….loop….end loop;
      begin
      while 条件
      Loop 循环体
      end loop;
      end;
      –for循环
      begin
      for i in start..end
      loop
      循环体
      end loop;
      end;
    ---loop循环
    
    declare
    i number(3):=1;  --->loop循环有变量的的声明
    begin
    loop---->对于loop循环可以先写一个大概的框架,按照do...while 来写
    --->loop....exit when...end loop;
    ---->然后里面的if语句也是同样先写好大概的框架
    --->if...then....elsif...then....esle....end if;
      if mod(i,2)<>0 then
        dbms_output.put_line(i);
      end if;
    exit when i=100;
      i:=i+1;  
    end loop;  
    end;
    ---while...loop...end loop
    declare 
    i number(3):=1;
    begin
      while i<100 loop --->注意这里的while后面的条件后面没有分号 
      --->相当于while() do....最好这里while...loop写在同一行
        if mod(i,2)<>0  then
           dbms_output.put_line(i);
        end if;
       i:=i+1;
      end loop;
    end;
    --for循环
    begin
      for i in 1..100 loop--->这里的loop也是写在for同一行
        if mod(i,2)<>0 then
          dbms_output.put_line(i);
        end if;
        --i:=i+1;-----》一定要注意for循环本身就有迭代器,所以不需要再进行i:=i+1的迭代了
      end loop;
    end;
    欢迎关注我的公众号:小秋的博客 CSDN博客:https://blog.csdn.net/xiaoqiu_cr github:https://github.com/crr121 联系邮箱:rongchen633@gmail.com 有什么问题可以给我留言噢~
  • 相关阅读:
    2016第5周四
    2016第5周三
    2016第5周二
    HTTP2.0那些事
    2016第4周日
    【C语言的日常实践(十二)】命令行参数
    Oracle改变字段类型
    Codeforces Round #269 (Div. 2)
    linux shell 命令
    Codeforces Round #256 (Div. 2) C. Painting Fence 或搜索DP
  • 原文地址:https://www.cnblogs.com/flyingcr/p/10428322.html
Copyright © 2020-2023  润新知