pl/sql练习案例

pl/sql练习案例

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

declare--声明变量v_w number(8,2):=&三角形的底边;v_h number(8,2):=&三角形的高;v_s number(8,2);begin  --计算面积  v_s:=(v_w*v_h)/2;  --控制台输出  dbms_output.put_line(‘三角形的面积:‘||v_s);end;

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

declare--声明变量v_empno number(8,2):=&员工编号;v_count number(8,2);v_avg number(8,2);begincase v_empno  when 10 then    dbms_output.put_line(‘部门名称为:技术部‘);  when 20 then    dbms_output.put_line(‘部门名称为:销售部‘);  when 30 then    dbms_output.put_line(‘部门名称为:公关部‘);  when 40 then    dbms_output.put_line(‘部门名称为:开发部‘);  else    dbms_output.put_line(‘输入错误‘);end case;?  select count(*) into v_count from emp e where deptno=v_empno;  dbms_output.put_line(‘总人数为:‘||v_count);    select avg(sal+nvl(comm,0)) into v_avg from emp         where deptno=v_empno;  dbms_output.put_line(‘平均工资为:‘||v_avg);?end;

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

这里用loop循环

declaretype emp_table_type is table of emp%rowtypeindex by binary_integer;v_emp emp_table_type;v_i number(8):=1;begin--这里用到了bulk collect into  (批量效率的读取游标数据)  select * bulk collect into v_emp from emp ;  loop    if v_i>v_emp.count then      exit;    end if;      dbms_output.put_line(        ‘员工编号:‘||v_emp(v_i).empno        ||‘员工姓名:‘||v_emp(v_i).ename        ||‘工资:‘||v_emp(v_i).sal        ||‘部门编号:‘||v_emp(v_i).deptno        );    v_i:=v_i+1;  end loop;?end;

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

这里用for 循环

declaretype emp_table_type is table of emp%rowtypeindex by binary_integer;v_emp emp_table_type;begin  select * bulk collect into v_emp from emp where sal>(  select avg(sal) from emp where deptno=&no)and  deptno=&no;  for v_i in 1..v_emp.count    loop      dbms_output.put_line(‘员工编号‘||v_emp(v_i).empno||      ‘员工姓名‘||v_emp(v_i).ename  ||      ‘上级领导‘||v_emp(v_i).job ||      ‘领导编号‘||v_emp(v_i).mgr  ||      ‘入职日期‘|| v_emp(v_i).hiredate ||      ‘工资‘||v_emp(v_i).sal  ||      ‘奖金‘|| v_emp(v_i).comm ||      ‘职位编号‘||v_emp(v_i).deptno);    end loop;?end;

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

这里用while循环

declaretype emp_table_type is table of emp%rowtypeindex by binary_integer;v_emp emp_table_type;v_i number(8):=1;begin  select * bulk collect into v_emp from emp;  while v_i<v_emp.count    loop      dbms_output.put_line(      ‘员工编号‘||v_emp(v_i).empno||      ‘员工姓名‘||v_emp(v_i).ename||      ‘领导姓名‘||v_emp(v_i).job||      ‘部门编号‘||v_emp(v_i).deptno);      v_i:=v_i+1;    end loop;end;

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

declarev_comm emp.comm%type;v_yyyy number(8);v_empno emp.empno%type:=&员工编号;begin--三个查询,先查询出当前日期和员工入职日期,然后计算出两者的相差--months_between  计算两个时间段相差的月份  select months_between(        (select sysdate from dual),        (select hiredate from emp where empno=v_empno))         into v_yyyy from dual;  --查询出工资员工       select comm into v_comm from emp where empno=v_empno;  --将计算后的时间换算为年  v_yyyy:=v_yyyy/12;  --判断  if v_yyyy>=6 then    if v_comm is null then      update emp set comm=(2000) where empno=v_empno;    else      update emp set comm=(v_comm+2000) where empno=v_empno;    end if;    dbms_output.put_line(‘发放奖金2000元‘);  elsif v_yyyy<6 then    if v_comm is null then        update emp set comm=(1500) where empno=v_empno;      else        update emp set comm=(v_comm+1500) where empno=v_empno;    end if;    dbms_output.put_line(‘发放奖金1500元‘);   else    dbms_output.put_line(‘输入错误‘);  end if;end;

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

loop循环

declarev_i number(8):=1;v_m varchar2(1000):=‘‘;begin  loop    if v_i>100 then      exit;    end if;    v_m:=v_m||v_i||‘  ‘;    v_i:=v_i+1;  end loop;  dbms_output.put_line(v_m);?end;

while 循环

declarev_i number(8):=1;v_m varchar2(1000):=‘‘;begin  while v_i<=100    loop       v_m:=v_m||v_i||‘  ‘;    v_i:=v_i+1;    end loop;  dbms_output.put_line(v_m);?end;

for 循环

declare

v_m varchar2(1000):=‘‘;
begin
  for v_i in 1..100
    loop
      v_m:=v_m||v_i||‘  ‘;
    end loop;
    dbms_output.put_line(v_m);
end;

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

declare
v_i number(8);
v_j number(8):=1;
v_n number(8):=0;
begin
  for v_i in 1..100
    loop
      while v_j<=v_i
        loop
          if mod(v_i,v_j)=0 then
            v_n:=v_n+1;
          end if;
          v_j:=v_j+1;
        end loop;
        v_j:=0;
        if v_n=2 then
          dbms_output.put_line(v_i);
        end if;
        v_n:=0;
    end loop;
end;

原文地址:https://www.cnblogs.com/nnnnmmmm/p/10835897.html

时间: 2024-08-04 20:15:35

pl/sql练习案例的相关文章

百倍性能的PL/SQL优化案例(r11笔记第13天)

我相信你是被百倍性能的字样吸引了,不过我所想侧重的是优化的思路,这个比优化技巧更重要,而结果嘛,其实我不希望说成是百倍提升,""自黑""一下. 有一个真实想法和大家讨论一下,就是一个SQL语句如果原本运行20秒,优化到了1秒,性能提升该说是20倍还是提高了95%.当然还见过一种说法,一条SQL语句每次运行20秒,每天运行100次,优化后每次运行1秒,运行还是100次,那么性能提升是说成优化累计时间为100*20-100=1990秒? 好了,我们来看看PL/SQL的优

PL/SQL重新编译包无反应案例2

在这篇"PL/SQL重新编译包无反应"里面介绍了编译包无反应的情况,今天又遇到一起案例, 在测试环境中,一个包的STATUS为INVALID,重新编译时,一直处于编译状态,检查发现下面两条因素都不存在: 1:当包正在被调用执行时,编译该包会导致无响应情况.     2:包中的对象或依赖对象被其它session所拥有. 后面检查发现包中调用了一个LINKED SERVER,由于迁移测试服务器,原服务器的IP地址变化了,导致LINKED SERVER已经无效了.所以出现了这种情况.重建了L

PL/SQL中的变量案例解析

1.标量: ag1: declare v_ename emp.ename%type;--自己称为单变量 begin select ename into v_ename from emp where empno=&no; dbms_output.put_line('雇员名称'||v_ename); end; ag2: declare type test1 is record(t1 emp.ename%type,t2 emp.sal%type);--定义记录型变量 v_tt test1;--v_tt

pl/sql编程基础

PL/SQL 1.过程.函数.触发器是pl/sql编写的 2.过程.函数.触发器是存放在oracle数据库中的 3.pl/sql是非常强大的过程化语言 4.过程.函数.触发器可以在java程序中调用 pl/sql编写能节省一点时间就是提高了性能(量大),java直接调用数据库存放的过程,解析时间就节省下来了,提高了性能 模块化的设计思想----->存储过程 网络传输(java程序中编写的sql语言),直接调用数据库的过程节省了传输量 提高安全性(存储过程避免了数据库信息的泄漏) 缺点: 移植性不

pl/sql乱码的问题

案例一: 使用的是服务器上的,不是本机的Oracle,按下面做就可以了: 设置环境变量:NLS_LANG,具体值用下面查询的值: select userenv('language') from dual; 或者 SELECT 'AMERICAN_AMERICA.' || PROPERTY_VALUE FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME = 'NLS_CHARACTERSET';    假如服务器的是:AMERICAN_AMERICA.ZHS1

oracle 学习笔记之PL/SQL程序设计

1.PL/SQL的定义: PL/SQL(Procedure Language/SQL) PLSQL是Oracle对sql语言的过程化扩展 指在SQL命令语言中增加了过程处理语句(如分支.循环等),使SQL语言具有过程处理能力. 把SQL语言的数据操纵能力与过程语言的数据处理能力结合起来,使得PLSQL面向过程但比过程语言简单.高效.灵活和实用. Plsql(oracle),Transact-sql(SQL server) 2.入门程序-->打印hello world; set serverout

Oracle PL/SQL随堂笔记总结

1.pl/sql编程 1.理解oracle的pl/sql的概念    2.掌握pl/sql编程技术(过程.函数.触发器)    pl/sql是标准sql语句的扩展    简介        1.过程.函数.触发器都是由pl/sql编写        2.过程.函数.触发器是在oracle中        3.pl/sql是非常强大的过程语言        4.过程.函数等可以在java程序被调用    学习必要性:        1.提高应用程序的性能        2.模块化的设计思想    

[推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下)

原文:[推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下) [推荐]ORACLE PL/SQL编程详解之一: PL/SQL 程序设计简介(千里之行,始于足下) ——通过知识共享树立个人品牌. 继上六篇: [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) [推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆) [推荐]ORACLE PL/SQL编程之四:把游标说透(

(韩顺平讲解)pl/sql编程(二)

一.pl/sql进阶-控制结构 pl/sql中提供了三种条件分支语句 if -- then, if --then---else, if---then---elsif---else (1)简单的条件判断 if – then 问题:编写一个过程,可以输入一个雇员名,如果该雇员的工资低于2000,就给该员工工资增加10%. Sql代码 1. create or replace procedure sp_pro6(spName varchar2) is 2. --定义 3. v_sal emp.sal%