标签:
一.示例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|delete) 177 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=2; 187 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 rollback; 210 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 exit; 292 293 --切换用户 294 conn scott 295 296 --切换用户 297 conn user1 298 299 --切换用户 300 conn system 301 --查表
二、示例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
标签:
原文地址:http://www.cnblogs.com/holly8/p/5701842.html