zoukankan      html  css  js  c++  java
  • oracle 中使用 pl/sql代码块

    1、写匿名块,输入三角形三个表的长度。在控制台打印三角形的面积。

    declare
              -- (p=(a+b+c)/2)
              --声明三角形的面积 三条边 的
     
              v_a number (10,2):=&no1;
             v_b number (10,2):=&no2;
             v_c number (10,2):=&no3;
            v_p number (10,2);
        begin
              v_p:=1/4*sqrt((v_a+v_b+v_c)*(v_a+v_b-v_c)*(v_a+v_c-v_b)*(v_b+v_c-v_a));
    --打印输出 dbms_output.put_line('三角形面积是:'||v_p); end;

    2、输入部门编号,在控制台打印这个部门的名称,总人数,平均工资(基本工资+奖金)

    declare
    --声明部门编号
        type emp_record_type is record(
                 dname dept.dname%type,
                 empno emp.empno%type,
                 sal emp.sal%type
    );
            v_emp emp_record_type;
            v_depton emp.deptno%type;
            v_avg emp.sal%type;
            v_count number(8,2);
        begin
          --查询这个部门的总人数 计算出 这个部门的平均工资 平均工资是(基本工资+奖金)
     select dname,count(*),avg(sal+nvl(comm,0))into v_emp from emp e inner join dept d on e.deptno=d.deptno where e.deptno=&no group by e.deptno,dname;
          --打印输出
           dbms_output.put_line('部门名称:'||v_emp.dname||',平均工资'||v_emp.sal||'总数'||v_emp.empno); end;

    3、编写一个PL/SQL块,输出所有员工的员工姓名、员工号、工资和部门号

    declare 
    --定义记录类型
        type emp_record_type is record(
           ename emp.ename%type,
            empno emp.empno%type,
            sal emp.sal%type,
         deptno emp.deptno%type     
    );
        type emp_table_type is table of emp_record_type index by binary_integer;
    
    --定义表变量
        v_emp emp_table_type;
    
    --定义循环变量
    
    v_num number(8);
    
    begin
      select count(empno) into v_num from emp;
    
      for i in 1 .. v_num
      loop
        select ename,empno,sal,deptno into v_emp(i) from (select e.*,rownum r from emp e where rownum<=14) where r=i;
      end loop;
      
      
      for i in 1 .. v_num
      loop
        dbms_output.put_line('员工姓名:'||v_emp(i).ename||',员工号:'||v_emp(i).empno||',工资:'||v_emp(i).sal||'部门号:'||v_emp(i).deptno);
      end loop;
    end;

     

     4,编写一个PL/SQL块,输出所有比本部门平均工资高的员工信息。

    declare
    v_sal emp.sal%type;
    --在控制台输入部门编号
    v_deptno emp.deptno%type :=&no;
    --查询所有比本部门平均工资高的员工信息
    cursor query_info is select e.empno, e.ename,e.sal,e.deptno
    from emp e where sal>(
    select  avg(sal+nvl(comm,0)) from emp where deptno=v_deptno);
    
    sal emp.sal%TYPE;
    empno dbms_sql.Number_Table;
    ename dbms_sql.Varchar2_Table;
    deptno dbms_sql.Number_Table;
    begin
      --遍历打印
    for v_count in query_info loop
    dbms_output.put_line('员工编号'||v_count.empno ||'员工姓名 '||v_count.ename ||' 基本工资'||v_count.sal ||'部门编号 '||v_count.deptno);
    end loop ;
    end;

    5、编写一个PL/SQL块,输出所有员工及其部门领导的姓名、员工号及部门号。

    declare
    v_emp  emp%rowtype;
    cursor a is select a.empno,a.ename,a.deptno,m.ename mname from emp a inner join emp m on a.empno=m.mgr;
     
    begin
      for v_emp in a
        loop
          dbms_output.put_line('员工编号:'||v_emp.empno||'员工姓名:'||v_emp.ename||'部门编号:'||v_emp.deptno||' 领导姓名 '||v_emp.mname);
          end loop;
      end;

    6,查询姓为“SMITH”的员工信息,并输出其员工号、姓名、工资、部门号。如果该员工不存在,则插入一条新记录,员工号为2012,员工姓名为“Smith”,工资为7500元,入职日期为“2002年3月5日”,部门号为50。如果存在多个名“Smith”的员工,则输出所有名为“Smith”的员工号、姓名、工资、入职日期、部门号L。

    declare
    v_emp emp%rowtype;
    
    begin
      select * into v_emp from emp where ename='Smith';
      dbms_output.put_line('工号:'||v_emp.empno||',姓名:'||v_emp.ename||',工资:'||v_emp.sal||',部门号:'||v_emp.deptno);  
        
    exception
      when no_data_found then
      insert into emp(empno,ename,sal,deptno) values(2016,'Smith',7500,50);
     
      commit;
      when too_many_rows then
          for v_emp in (select * from emp where ename='Smith') loop
          dbms_output.put_line('工号:'||v_emp.empno||',姓名:'||v_emp.ename||',工资:'||v_emp.sal||',部门号:'||v_emp.deptno);
        
      end loop;  
    
     
    end;

    7、输入员工编号,根据员工的入职时间修改发放奖金类,大于等于6年的奖金为2000,小于6年的奖金是1500

     

    begin
      select hiredate into v_hiredate from emp where empno=&no1;
      if(sysdate-v_hiredate)>365*6 then
        v_comm:=2000;
        else
        v_comm:=1500;
      end if;
      update emp set comm=v_comm where empno=&no;
      if(sql%rowcount>0)then
      dbms_output.put_line('修改成功');
      else
      dbms_output.put_line('修改失败');
      end if;
    end;

     8.计算一百以内的素数

    declare
    fig boolean;
    
    begin
      --循环100以内的数
      for i in 2..100
        loop
    --  判断是否是素数,条件满足
      fig:=true;
      for j in 2..trunc(i/2)
        loop
          
        if(mod(i,j)=0)then
        fig:=false;
        exit;
        end if;
        
      end loop;
      --最后输出判断,如果fig为true。则该自然数是素数,则输出
      if fig then
        dbms_output.put_line(i);
        end if;
        
      end loop;
    end;

    9、输出100以内的自然数

    --使用loop循环输出一百以内的自然数
    declare
    v_i number(8):=1;
    begin
      loop
        dbms_output.put_line(v_i);
        if v_i>=100 then
          exit;
         
        end if;
        v_i:=v_i+1;
        end loop;
    end;
    --使用while循环输出一百以内的自然数
    declare
    V_i number(8):=1;
    
    begin
      while v_i<=100
      loop
        dbms_output.put_line(v_i);
        v_i:=v_i+1;
      end loop;
    end;
    
    declare
    --使用for循环输出一百以内的自然数
    begin
     for v_i in 1..100
       loop
         dbms_output.put_line(v_i);
       end loop;
    end;
    declare
    v_emp emp_table%type;
    
    begin
    select * bulk collect into v_emp from emp;
    for v_i in v_emp.first .. v_enmp.last
    loop
      dbms_output.put_line('员工编号'||v_emp(v_i),empno);
    end loop;  
    end;

     



  • 相关阅读:
    MySQL 中 where id in (1,2,3,4,...) 的效率问题讨论
    创建,增加,删除mysql表分区
    mysql分区及实例演示
    MySQL的表分区详解
    MySQL 存储过程传参之in, out, inout 参数用法
    MySQL里面的子查询实例
    超详细mysql left join,right join,inner join用法分析
    MySQL force Index 强制索引概述
    MyISAM和InnoDB的索引在实现上的不同
    java中的守护线程
  • 原文地址:https://www.cnblogs.com/hph1728390/p/10828613.html
Copyright © 2011-2022 走看看