码迷,mamicode.com
首页 > 其他好文 > 详细

10.程序包

时间:2016-07-24 23:49:51      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:

一.示例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

 

10.程序包

标签:

原文地址:http://www.cnblogs.com/holly8/p/5701842.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!