--存储过程范例:得到雇员表 emp 的记录数 begin
--说明:若过程中要向外抛异常,请使用 exception when others then raise; 这个抛出的异常在程序里是可以捕获的。
create or replace procedure getEmpCount AS
v_total number(10);
begin
select count(*) into v_total from emp;
dbms_output.put_line('雇员总人数为:'||v_total);
end;
--存储过程范例:得到雇员表 emp 的记录数 end
 
 
--函数范例,通过 id 得到雇员姓名 begin--
create or replace function get_name(p_id in number default 1) return varchar2 as
v_name varchar2(30);
begin
  select name into v_name from emp where id = p_id;
  return (v_name);
  exception
  when no_data_found then dbms_output.put_line('没有该ID:'||p_id);
  return (null);
  when too_many_rows then dbms_output.put_line('有重复的ID!');
  return (null);
  when others then dbms_output.put_line('发生其他错误!');
  return (null);
end;
--函数范例,通过 id 得到雇员姓名 end--
 
 
 
 
--包范例:雇员表 emp 的增、删、改、查 
--说明:包,分为包头(当做接口)和包体(当做实现类),外部只能调用到在包头中申明过的内容,包体内属于私有内容,外部(其它用户)是调用不到的--
--包头 begin--
create or replace package pkg_emp is
  v_emp_count number(5);--雇员人数
  procedure init(p_max number, p_min number);--初始化
  procedure showEmps;--显示雇员列表
  procedure insertEmp(p_id number, p_name varchar2, p_salary number);--插入雇员
  procedure changeSalary(p_id number, p_salary number);
end pkg_emp;
--包头 end--
 
--包体 begin-- 
create or replace package body pkg_emp is
  v_message varchar2(50);--显示信息
  v_max_sal number(7);--工资上限
  v_min_sal number(7);--工资下限
  function exist(p_id number) return boolean;--判断雇员是否存在
  procedure showMessage;--显示信息
  --初始化--
  procedure init(p_max number, p_min number) is begin
    select count(*) into v_emp_count from emp;
    v_max_sal := p_max;
    v_min_sal := p_min;
    v_message := '初始化过程已经完成!';
    showMessage;
  end init;
  --显示雇员列表--
  procedure showEmps is begin
    dbms_output.put_line('ID 姓名 工资');
    for v_emp in(select * from emp) loop
      dbms_output.put_line(to_char(v_emp.id)||RPAD(v_emp.name,10,'')||to_char(v_emp.salary));
    end loop;
    dbms_output.put_line('雇员总人数'||v_emp_count);
  end showEmps;
  --插入雇员--
  procedure insertEmp(p_id number, p_name varchar2, p_salary number) is begin
      if not exist(p_id) then
        insert into emp(id, name, salary) values(p_id, p_name, p_salary);
        commit;
        v_emp_count := v_emp_count + 1;
        v_message := '雇员['||p_id||', '||p_name||', '||p_salary||']已插入!';
      else
        v_message := '雇员['||p_id||', '||p_name||', '||p_salary||']已存在,无法插入!';
      end if;
      showMessage;
    exception
      when others then
        v_message := '雇员['||p_id||', '||p_name||', '||p_salary||']插入异常!';
      showMessage;
  end insertEmp;
  --删除雇员--
  procedure deleteEmp(p_id number) is begin
      if exist(p_id) then
        delete from emp where id = p_id;
        commit;
        v_emp_count := v_emp_count - 1;
        v_message := '雇员['||p_id||']删除成功!';
      else
        v_message := '雇员['||p_id||']不存在,删除失败!';
      end if;
      showMessage;
    exception
      when others then
        v_message := '雇员['||p_id||']删除异常!';
      showMessage;
  end deleteEmp;
  --修改雇员工资--
  procedure changeSalary(p_id number, p_salary number) is begin
      if (p_salary > v_max_sal or p_salary < v_min_sal) then
         v_message := '工资超出修改范围!';
      elsif not exist(p_id) then
         v_message := '雇员['||p_id||']不存在,无法修改!';
      else
         update emp set salary = p_salary where id = p_id;
         commit;
         v_message := '雇员['||p_id||']修改成功!';
      end if;
      showMessage;
    exception
      when others then
         v_message := '雇员['||p_id||']修改异常!';
      showMessage;
  end changeSalary;
  --显示信息--
  procedure showMessage is begin
    dbms_output.put_line('提示信息:'||v_message);
  end showMessage;
  --判断雇员是否存在--
  function exist(p_id number) return boolean is
  v_num number;--局部变量
  begin
    select count(*) into v_num from emp where id = p_id;
    if v_num=1 then
       return true;
    else
       return false;
    end if;
  end exist;
---------------
end pkg_emp;
--包体 end--
 
 
 
select * from emp; 
delete from emp;
--调用调试--
begin
pkg_emp.init(p_max => 6000, p_min => 600);--包头初始化
end;
 
begin 
pkg_emp.showEmps();--显示雇员列表
end;
 
begin 
pkg_emp.insertEmp(p_id => 3, p_name => 'maot', p_salary => 5000 );--插入雇员
end;
 
begin 
dbms_output.put_line('当前雇员总人数:'||maod.pkg_emp.v_emp_count);--通过全局变量 v_emp_count 查看雇员人数
end;
 
begin 
maod.pkg_emp.deleteEmp(p_id => 1);--删除雇员
end;
 
begin 
maod.pkg_emp.changeSalary(p_id => 1, p_salary => 5000);--修改雇员工资
end;
 

Oracle - 存储过程、函数、包的使用练习-雇员的更多相关文章

  1. oracle-游标-存储过程-函数-包

    一.存储过程 不可以在insert,update,delete中直接使用,可以有return但代表的是退出过程 过程有三种类型:不返回值,可以返回多个值,参数有三种类型,分别如下: in:只输入,不返 ...

  2. oracle存储过程学习---包的概念

    转自:http://www.iteye.com/topic/1111793 一.包的概念   类似于一个容器,能打包相应的Pl/SQL变量.常量.函数.过程.复合数据类型等元素到这个容器内.用来限制  ...

  3. oracle 存储过程(包)的写法和执行

    --in 代表输入参数,out 代表输出参数create or replace procedure myproc(id in int, v_message out varchar2) is--定义临时 ...

  4. oracle存储过程函数

    1.函数 create or replace function get_Destroy_no return varchar2 is Result varchar2(50);begin SELECT m ...

  5. Oracle存储过程(包:PACK_KPI_KERNEL For YS三度评价体系)

    CREATE OR REPLACE PACKAGE PACK_KPI_KERNEL IS --定义多级数组 字符串 TYPE TSTRARRY ) INDEX BY BINARY_INTEGER; T ...

  6. Oracle存储过程 函数 计算使用资源

    目录 存储过程与函数 存储过程的优势 存储过程 打印语句 选择语句 函数 计算使用资源 存储过程与函数 存储过程的优势 存储过程 /* 多行注释 */ -- 单行注释 //展示错误信息 show er ...

  7. hibernate调用oracle存储过程||函数

    pakeage dao.Impl; //调用函数FUN_GET(); public String get(String Id,String Name){ return getSession().cre ...

  8. Oracle存储过程、包、方法使用总结

    /** *@author:zhengwei *@date:2017-04-28 *@desc:存储过程用法总结 */ CREATE OR REPLACE PROCEDURE MYPROCEDURE(P ...

  9. oracle 存储过程和包的权限

    GRANT CREATE ANY PROCEDURE TO MONKEY --創建,查看,替換的權限 GRANT EXECUTE ANY PROCEDURE TO MONKEY --執行和查看的權限 ...

  10. oracle 存储过程,存储函数,包,

    http://heisetoufa.iteye.com/blog/366957 认识存储过程和函数 存储过程和函数也是一种PL/SQL块,是存入数据库的PL/SQL块.但存储过程和函数不同于已经介绍过 ...

随机推荐

  1. 修改Gradle本地仓库

    问题描述 Gradle 默认的本地仓库为 C:\Users\用户名\.gradle,不想让其一直下载东西占用 C 盘资源. 解决方法 新建环境变量名:GRADLE_USER_HOME,变量值为:D:\ ...

  2. 1088 Rational Arithmetic(20 分)

    For two rational numbers, your task is to implement the basic arithmetics, that is, to calculate the ...

  3. 原svn账户清除,及使用新用户名密码操作方法

    原svn账户清除,及使用新用户名密码操作方法 第一步:先清除原svn账户信息,如图示,电脑桌面右击“ToroiseSVN--Settings”. 在Settings中,选择Saved Data中的Cl ...

  4. PHP异步任务worker

    1.概述 异步任务框架主要包含两个角色: WorkerServer主要负责管理(启动,重启,监控等)worker工作进程. Worker负责从指定消息队列获取任务消息并执行任务. 为了提高worker ...

  5. LeetCode 179 Largest Number 把数组排成最大的数

    Given a list of non negative integers, arrange them such that they form the largest number.For examp ...

  6. windows下apache服务器的下载,安装,配置

    1.进行apache官网->Download->Files for Microsoft Windows->ApacheHaus,然后选择合适的版本下载 2.将下载下来的压缩包解压到合 ...

  7. HDU 5775 L - Bubble Sort 树状数组

    给定一段冒泡排序的代码,要求输出每个数字能到达的最右边的位置和最左边的位置的差 因为那段冒泡排序的代码是每次选取一个最小的数,放在左边的,所以,每个数最多能到达右边的位置应该是起始位置i+右边有多少个 ...

  8. (转)CentOS 7系统详细开机启动流程和关机流程

    CentOS 7系统详细开机启动流程和关机流程 原文:http://blog.csdn.net/yuesichiu/article/details/51350654 名称 bootup - 系统启动流 ...

  9. Hibernate的工作流程以及三种状态(面试题)

    Hibernate的工作流程以及三种状态 部分转载自:http://www.cnblogs.com/fifiyong/p/6390699.html Hibernate的工作流程: 1. 读取并解析配置 ...

  10. pat1049. Counting Ones (30)

    1049. Counting Ones (30) 时间限制 10 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue The task ...