• 10.程序包


    一.示例1

      1 --存储过程
      2 create or replace procedure addemp( var_sal  in out number  )
      3 is|as
      4 
      5 begin
      6 
      7 end  8 
      9 --函数
     10 create or replace function addemp(var_sal number) return number
     11 is|as
     12   v_num number;
     13 begin
     14       -------
     15     return v_num;
     16  
     17 end 18 
     19 --1.程序包包头=接口
     20 所有成员全部是public 
     21 所有的变量都是成员变量而且都是静态的==可以通过类名直接调用
     22 所有的方法抽象方法==没有实现细节
     23 create or replace package 包名
     24 is|as
     25     声明变量
     26     声明(方法)函数、存储过程
     27 end 包名;
     28 
     29 --2.程序包包体==实现类
     30 实现接口里所有的方法,
     31 程序包中所有的方法和变量都是私有的
     32 create or replace package body 包体名称(该名称必须和包名一样)
     33 is|as
     34    begin
     35        //实现第一个函数或存储过程的细节
     36    end 37   begin
     38        //实现第二个函数或存储过程的细节
     39    end 40   .....
     41 
     42   begin
     43        初始化接口里的里成员变量;
     44 
     45 end 包体名称;
     46 
     47 
     48 --3.在plsql块调用程序包实现功能呢
     49 declare
     50 
     51 begin
     52    //调用包体里面的内容
     53    包体名称.函数或存储过程
     54 end;
     55 
     56 --1.创建程序包
     57 create or replace package emp_package is
     58   --定义成员变量
     59   minsal emp.sal%type;
     60   maxsal emp.sal%type;
     61 
     62   --定义函数和存储过程
     63  --添加雇员信息
     64  procedure add_emp(p_eno number,p_name varchar2,p_sal number,p_dno number);
     65 
     66 --通过员工编号获取工资
     67  function get_sal(p_eno number) return number;
     68 
     69 end emp_package;
     70 /
     71 
     72 --2.创建程序包体
     73 create or replace package body emp_package is
     74 --(1)只要工资在最大值和最小值之间就添加员工信息
     75 procedure add_emp(p_eno number,p_name varchar2,p_sal number,p_dno number) 
     76 is
     77   v_info varchar2(40);
     78 begin
     79    if p_sal between minsal and maxsal then
     80       insert into emp(empno,ename,sal,deptno) values(p_eno,p_name,p_sal,p_dno)
     81       returning empno||','||ename||','||sal||','||deptno into v_info;
     82       dbms_output.put_line(v_info);
     83    else
     84      dbms_output.put_line('工资不在指定范围内');
     85    end if;  
     86 exception
     87     when dup_val_on_index then
     88       dbms_output.put_line('该员工已经存在');
     89 end;
     90 
     91 --(2)通过员工编号查询工资
     92 function get_sal(p_eno number) return number
     93 is
     94     v_sal emp.sal%type;  --用来接收查询到的值并返回
     95 begin
     96    select sal into v_sal from emp where empno=p_eno;
     97    return v_sal;
     98 exception
     99    when no_data_found then
    100      dbms_output.put_line('没有找到该员工信息');
    101 end;
    102 
    103 --(3)初始化部分
    104 begin
    105      select min(sal),max(sal) into minsal,maxsal from emp;
    106 end emp_package;
    107 /
    108 
    109 --3.调用程序包内容
    110 --添加员工信息
    111 set serverout on
    112 begin
    113    --调用程序包中存储过程
    114    emp_package.add_emp(5001,'holly',3000,20);
    115    dbms_output.put_line('添加成功');
    116    commit;
    117 end;
    118 /
    119   
    120 --根据员工编号查询员工工资
    121 set timing on
    122 set serverout on
    123 declare
    124    v_sal number;
    125 begin
    126    v_sal:=emp_package.get_sal(5000);
    127   dbms_output.put_line('5000雇员工资为:'||v_sal);
    128 end;
    129 /
    130 
    131 --4.程序包中的游标使用
    132 --创建程序包包头
    133 create or replace  package emp_cursorPackage is
    134    --定义游标类型
    135    type type_emp_cursor is ref cursor;
    136 end emp_cursorPackage;
    137 /
    138 
    139 --定义存储过程
    140 create or replace procedure proc_emp(cur out emp_cursorPackage.type_emp_cursor)
    141 as
    142 begin
    143     open cur for
    144         select empno,sal from emp;
    145 end proc_emp;
    146 /
    147 
    148 --调用存储过程
    149 declare
    150    v_empno emp.empno%type;
    151    v_sal emp.sal%type;
    152    emp_sal emp_cursorPackage.type_emp_cursor; --定义游标变量
    153 begin
    154    --调用存储过程
    155    proc_emp(emp_sal);
    156 
    157   loop
    158      fetch emp_sal into v_empno,v_sal;
    159     exit when emp_sal%notfound;
    160     dbms_output.put_line(v_empno||'的员工工资为:'||v_sal);
    161   end loop;
    162   close emp_sal;
    163 end;
    164 /
    165   
    166 
    167 --触发器
    168 分类:
    169 (1)行级触发器:DML,如果操作批量数据,会出现多个影响语句
    170 (2)语句级触发器:DML ,如果操作批量数据,会出现一个影响语句
    171 (3)instead of 触发器
    172 (4)模式触发器:DDL
    173 (5)数据库级触发器 :数据库登陆、注销等操作
    174 --行级触发器语法
    175 create  or replace trigger  触发器名字
    176 before|after  (动作update|insert|delete177 on 表名
    178 for each row --行级触发器
    179 begin
    180     --备份操作(插入删除的数据到备份表)
    181 end;
    182 
    183 --快速复制表结构并创建
    184 --where条件为true或不写where条件复制表数据和表结构,
    185 --where条件为false只复制表结构不复制表数据
    186 create  table del_emp as select * from emp where 1=2187 
    188 --1.建立一个触发器,当删除某一条记录时,将删除数据插入到某张备份表
    189 create or replace trigger tr_del_emp
    190    before delete  --触发的时机是删除前触发
    191    on emp    --指定操作的表
    192    for each row              --行级触发器
    193    when (old.deptno<>10)  --触发的条件
    194 begin
    195    --删除前将数据插入到备份表
    196    insert into del_emp(deptno,empno,ename,job,mgr,sal,comm,hiredate)
    197       values( :old.deptno, :old.empno, :old.ename, :old.job, :old.mgr, :old.sal, :old.comm,
    198        :old.hiredate);
    199 end;
    200  /
    201 
    202 --删除5001数据
    203 delete emp where empno=7902;
    204 
    205 --查询备份表
    206 select * from del_emp;
    207 
    208 --回滚
    209 rollback210 
    211 --删除触发器
    212 drop trigger tr_del_emp; 
    213 
    214 --2.语句触发器( 默认触发器)
    215 create or replace trigger upda_emp
    216   after insert or update or delete
    217   on emp
    218 begin
    219    if updating then
    220       dbms_output.put_line('数据已经更新');
    221   elsif deleting then
    222      dbms_output.put_line('数据已删除');
    223   elsif inserting then
    224     dbms_output.put_line('数据插入');
    225   end if;
    226 end;   
    227 /
    228 --删除
    229 delete from emp;
    230 
    231 --回滚
    232 rollback;
    233 
    234 --删除触发器
    235 drop trigger upda_emp;
    236 
    237 conn system
    238 >accp
    239 
    240 --创建用户
    241 create user user1 identified by user1;
    242 
    243 --授权
    244 grant connect,resource to user1;
    245 
    246 --切换用户user1
    247 conn user1
    248 
    249 --创建记录表
    250 create table event_ddl(event varchar2(20), username varchar2(10),owner varchar2(10),
    251    objname varchar2(20),objtype varchar2(10),time date);
    252 
    253 --3.模式触发器DDL
    254 create or replace trigger tr_ddl
    255   after ddl on user1.schema
    256 begin
    257   insert into event_ddl values(ora_sysevent,
    258      ora_login_user,
    259      ora_dict_obj_owner,
    260      ora_dict_obj_name,
    261     ora_dict_obj_type,
    262    sysdate);
    263 end;
    264 /
    265 
    266 --调用触发器
    267 create table temp(a number);
    268 
    269 --删除表
    270 drop table temp;
    271 
    272 --删除触发器
    273 drop trigger tr_ddl;
    274 
    275 --4.数据库级触发器
    276 conn system
    277 
    278 --创建数据库操作记录表
    279 create table log_table(username varchar2(20), 
    280     login_time date,logoff_time date,address varchar2(20));
    281 
    282 --创建触发器
    283 create or replace trigger tr_login
    284    after logon on database
    285 begin
    286    insert into log_table(username,login_time,address)
    287      values(ora_login_user,sysdate,ora_client_ip_address);
    288 end;
    289 /
    290 --退出登录
    291 exit292 
    293 --切换用户
    294 conn scott
    295 
    296 --切换用户
    297 conn user1
    298 
    299 --切换用户
    300 conn system
    301 --查表
    程序包示例1

    二、示例2:

      1 --一、程序包中使用子程序:存储过程和函数
      2 --1.创建程序包头
      3 create or replace package emp_package is
      4    minsal emp.sal%type;
      5    maxsal emp.sal%type;
      6    
      7    --(1).添加雇员信息,添加的员工工资不能低于最低,不能高于最高
      8    procedure add_emp(p_eno number,p_name varchar2,p_sal number,p_dno number) ;
      9    
     10    --(2)通过雇员编号修改雇员工资
     11    procedure upd_sal(p_eno number,p_sal number);
     12    
     13    --(3).通过雇员姓名修改雇员工资
     14    procedure upd_sal(p_name varchar2,p_sal number);
     15    
     16    --(4).通过雇员编号查询雇员工资
     17    function get_sal(p_eno number) return number;
     18 end emp_package;
     19 /
     20 
     21 --2.创建程序包体
     22 create or replace package body emp_package is
     23    --(1)添加雇员信息
     24    procedure add_emp(p_eno number,p_name varchar2,p_sal number,p_dno number)
     25    is
     26    begin
     27       if p_sal between minsal and maxsal then
     28          insert into emp(empno,ename,sal,deptno) values(p_eno,p_name,p_sal,p_dno);
     29       else
     30         dbms_output.put_line('工资不在范围内!');
     31       end if;
     32    exception
     33       when dup_val_on_index then
     34          dbms_output.put_line('该雇员已经存在');
     35    end; 
     36    
     37    
     38    --(2)通过雇员编号修改雇员工资
     39    procedure upd_sal(p_eno number,p_sal number)
     40    is
     41    begin
     42      if p_sal between minsal and maxsal then
     43         update emp set sal=p_sal where empno=p_eno;
     44         if sql%notfound then
     45           dbms_output.put_line('该雇员不存在');
     46         end if;
     47      else
     48         dbms_output.put_line('工资不在范围内');
     49      end if;
     50    end;
     51    
     52    --(3).通过雇员姓名修改雇员工资
     53    procedure upd_sal(p_name varchar2,p_sal number)
     54    is
     55    begin
     56       if p_sal between minsal and maxsal then
     57          update emp set sal=p_sal where ename=p_name;
     58          if sql%notfound then
     59             dbms_output.put_line('该雇员不存在');
     60          end if;
     61       else
     62          dbms_output.put_line('工资不在范围内');
     63       end if;
     64    end;
     65    
     66    
     67    --(4).通过雇员编号查询雇员工资
     68    function get_sal(p_eno number) return number
     69    is
     70       v_sal emp.sal%type;
     71    begin
     72      select sal into v_sal from emp where empno=p_eno;
     73      return v_sal;
     74    exception
     75      when no_data_found then
     76         dbms_output.put_line('该雇员不在');
     77    end;
     78    
     79    begin
     80      select min(sal),max(sal) into minsal,maxsal  from emp;
     81    end emp_package;
     82  /
     83  
     84  --3.调用程序包中子程序
     85  --(1)调用添加雇员信息
     86  set serverout on
     87  begin
     88    emp_package.add_emp(5000,'mary',300,20);
     89    dbms_output.put_line('添加成功');
     90    commit;
     91  end;
     92  /
     93  
     94  --(2)通过雇员编号查询雇员信息
     95  set serverout on
     96  declare
     97    v_sal emp.sal%type;
     98  begin
     99    v_sal:=emp_package.get_sal(1111);
    100    dbms_output.put_line('7369的雇员工资为:'||v_sal);
    101  end;
    102  /
    103  
    104 --二、程序包中的游标使用
    105  --1.创建程序包包头
    106 create or replace package emp_cursorPack is
    107   type type_emp_cursor is ref cursor;
    108 end emp_cursorPack;
    109 /
    110 
    111 --2.创建存储过程并且游标作为输出参数
    112 create or replace  procedure proc_emp(cur out emp_cursorPack.type_emp_cursor) as
    113   begin
    114       open cur for
    115         select empno,sal from emp;
    116 end proc_emp;
    117 /
    118 
    119 --3.调用存储过程提取返回的游标内容
    120 set serverout on
    121 declare
    122   --定义员工编号
    123   v_empno emp.empno%type;
    124 
    125   --定义员工工资
    126   v_sal emp.sal%type;
    127 
    128   --定义游标类型的变量
    129   emp_sal emp_cursorPack.type_emp_cursor;
    130 begin
    131   --调用存储过程,并将一堆数据存放在游标变量中
    132   proc_emp(emp_sal);
    133 
    134   --循环提取游标内容
    135   loop
    136      fetch emp_sal into v_empno,v_sal;
    137      exit when emp_sal%notfound;
    138      dbms_output.put_line(v_empno||'的薪水是'||v_sal);
    139   end loop;   
    140   close emp_sal;
    141 end;
    142 /
    143  
    144 
    145    
    146    
    程序包示例2
  • 相关阅读:
    React Native学习(一)——搭建开发环境
    Linux 命令系列之 seq
    Linux 提高操作效率之 tab 命令补全
    Atlassian 系列软件安装(Crowd+JIRA+Confluence+Bitbucket+Bamboo)
    代码质量管理 SonarQube 系列之 安装
    kworkerds 挖矿木马简单分析及清理
    shell 脚本常用调试方法
    JVM 调优之 Eclipse 启动调优实战
    基于 Njmon + InfluxDB + Grafana 实现性能指标实时可视监控
    nmon 的下一代工具 njmon
  • 原文地址:https://www.cnblogs.com/holly8/p/5701842.html
Copyright © 2020-2023  润新知