Oracle中PL/SQL 范例

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

declare
   
      v_side_first number(20):=&第一条边;
      v_side_second number(20):=&第二条边;
      v_side_third number(20):=&第三条边;
   
      v_p number(30);
      v_s number(30);
   begin
      v_p:=(v_side_first+v_side_second+v_side_third)/2;
      v_s:=sqrt(v_p*(v_p-v_side_first)*(v_p-v_side_second)*(v_p-v_side_third));
      dbms_output.put_line('三角形面积为:'||v_s);
   end;

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

      declare
        -- 声明record类型对象
        type emp_record_type is record (
-- 声明record类型中的变量 v_dname dept.dname
%type, v_count emp.empno%type, v_avgesal emp.sal%type ); v_emp emp_record_type; begin -- 查询所有需要的数据 赋值给变量 select d.dname,count(e.ename),avg(sal+nvl(comm,0)) into v_emp from emp e inner join dept d on e.deptno=d.deptno where d.deptno=&no group by d.dname;     -- 打印输出结果 dbms_output.put_line('部门名称:'||v_emp.v_dname||'总人数:'||v_emp.v_count||'平均工资:'||v_emp.v_avgesal); end;

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

   declare
       cursor c is select empno,ename,sal,deptno from emp;
   begin
       for v_emp in c 
        loop
           dbms_output.put_line('员工编号:'||v_emp.empno||',员工姓名:'||v_emp.ename||',基本工资:'||v_emp.sal||',部门编号:'||v_emp.deptno);
        end loop;
   end;

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

declare
   v_emp emp%rowtype;
   
   cursor c is select * from emp e1 where sal>(select avg(sal) from emp e2 where e1.deptno=e2.deptno);

begin
  
  for v_emp in c
    loop
      dbms_output.put_line('员工编号:'||v_emp.empno||',员工姓名:'||v_emp.ename||',员工职位:'||v_emp.job||',员工上级:'||v_emp.mgr||'雇佣日期:'||v_emp.hiredate||',基本工资:'||v_emp.sal||',奖金:'||v_emp.comm||',部门编号:'||v_emp.deptno);
    end loop;
 
end;

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

declare
     -- 声明record类型
     type emp_record_type is record(
       -- 声明record类型中的变量
        ename emp.ename%type,
        mname emp.ename%type,
        empno emp.empno%type,
        deptno emp.deptno%type
       
     );
     -- 声明table类型
     type emp_table_type is table of emp_record_type 
     -- 指定下标的增长方式为整数  每次增长1
     index by binary_integer;
     -- 声明table类型的变量
     v_emp emp_table_type;
       
begin
    -- 查询所有需要的数据   赋值给变量
    select ename,nvl((select e2.ename from emp e2 where e1.mgr=e2.empno),''),empno,deptno bulk collect into v_emp from emp e1;
    -- 循环   输出结果
    for i in 1..v_emp.count
    loop
      dbms_output.put_line('员工姓名:'||v_emp(i).ename||',领导姓名:'||v_emp(i).mname||',员工编号:'||v_emp(i).empno||',部门编号:'||v_emp(i).deptno);       
    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,hiredate,deptno) values (2012,'SMITH',7500,'5-3月-2001',50);
          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.hiredate||',部门编号:'||v_emp.deptno);
          end loop;
        end;

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

declare
   -- 声明变量
   v_empno emp.empno%type:=&no;
   v_hiredate emp.hiredate%type;
begin
  -- 根据输入员工编号,查询入职日期
  select hiredate into v_hiredate from emp where empno=&no;
  -- 判断员工的工作时间,大于等于6年,奖金为2000
  if (sysdate-v_hiredate)/365>=6 then
    update emp set comm=nvl(comm,0)+2000;
    
  else -- 反之,奖金为1500
    update emp set comm=nvl(comm,0)+1500;
  end if;
end;

8、分别用loop ,while,for循环在控制台输出1到100的自然数

-- loop 循环    
declare
   -- 声明循环变量
   v_i number(10):=1;
begin
  loop
    -- 判断循环条件, 条件成立,跳出循环
    if v_i>100 then
      exit;
    end if;
    -- 输出1到100的自然数
    dbms_output.put_line(v_i);
    -- 改变循环变量的值
    v_i:=v_i+1;
  end loop;
end;
==============================================
-- while 循环
declare
  --声明循环变量
  v_i number(10):=1;
begin
  -- 判断循环条件,条件成立,执行循环
  while v_i<=100
  -- while循环  输出打印1到100的自然数
  loop
    dbms_output.put_line(v_i);
    -- 改变循环变量的值
    v_i:=v_i+1;
  end loop;
  
end;
===============================================

-- for 不用循环判断,不用改变循环变量的值
declare

begin
  -- 不用声明循环变量
  for v_i in 1..100
    loop
      -- 输出打印1到100的自然数
      dbms_output.put_line(v_i);
    end loop;
      
end;

9、在控制台输出1到100以内的素数

declare
  v_no     number := 0; --标记是第几个素数
  v_number number; --表示1-100之间的数
  v_num    number;
begin
  for v_number in 1 .. 100 loop
    --如果整除,那就不是素数,除数+1,;
    --如果不能整除,那么被除数就+1,继续执行除运算
    v_num := ceil(v_number / 2);
    for i in 2 .. v_num loop
      if mod(v_number, i) = 0 then
        exit;
      elsif i > v_num - 1 then
        v_no := v_no + 1;
        dbms_output.put_line('' || v_no || '个素数是:' || v_number);
      end if;
    end loop;
  end loop;
end;
原文地址:https://www.cnblogs.com/zhangmenghui/p/10835519.html