吴裕雄--天生自然ORACLE数据库学习笔记:过程、函数、触发器和包

create procedure pro_insertDept is
begin
  insert into dept values(77,'市场拓展部','JILIN');        --插入数据记录
  commit;                                    --提交数据
  dbms_output.put_line('插入新记录成功!');        --提示插入记录成功
end pro_insertDept;
/
create or replace procedure pro_insertDept is
begin
  insert into dept values(99,'市场拓展部','BEIJING');    --插入数据记录
  commit;                                    --提交数据
  dbms_output.put_line('插入新记录成功!');        --提示插入记录成功
end pro_insertDept;
/
create or replace procedure insert_dept(
  num_deptno in number,                    --定义in模式的变量,它存储部门编号
  var_ename in varchar2,                    --定义in模式的变量,它存储部门名称
  var_loc in varchar2) is
begin
  insert into dept
  values(num_deptno,var_ename,var_loc);        --向dept表中插入记录
  commit;                                --提交数据库
end insert_dept;
/
create or replace procedure select_dept(
  num_deptno in number,--定义in模式变量,要求输入部门编号
  var_dname out dept.dname%type,--定义out模式变量,可以存储部门名称并输出
  var_loc out dept.loc%type) is
begin
  select dname,loc
  into var_dname,var_loc
  from dept
  where deptno = num_deptno;--检索某个部门编号的部门信息
exception
  when no_data_found then --若select语句无返回记录
    dbms_output.put_line('该部门编号的不存在');--输出信息
end select_dept;
/
set serverout on
declare
  var_dname dept.dname%type;
  var_loc dept.loc%type;
begin
  select_dept(99,var_dname,var_loc);
  dbms_output.put_line(var_dname||'位于:'||var_loc);
end;
/
create or replace procedure pro_square(
  num in out number,--计算它的平方或平方根
  flag in boolean) is  --计算平方或平方根的标识
  i int := 2; --计算平方的参数
begin
  if flag then --若为true
    num := power(num,i);--计算平方
  else
    num:=sqrt(num);--计算平方根
  end if;
end;
/
  
declare
  var_number number;--存储要进行运算的值和运算后的结果
  var_temp number;--存储要进行运算的值
  boo_flag boolean;--平方或平方根的逻辑标记
begin
  var_temp :=3;--变量赋值
  var_number :=var_temp;
  boo_flag := false;--false表示计算平方根;true表示计算平方
  pro_square(var_number,boo_flag);--调用存储过程
  if boo_flag then
    dbms_output.put_line(var_temp ||'的平方是:'||var_number);--输出计算结果
  else
    dbms_output.put_line(var_temp ||'平方根是:'||var_number);
  end if;
end;
/
create or replace procedure insert_dept(
  num_deptno in number,--定义存储部门编号的IN参数
  var_dname in varchar2 default '综合部',--定义存储部门名称的IN参数,并初始默认值
  var_loc in varchar2 default '北京') is
begin
  insert into dept values(num_deptno,var_dname,var_loc);--插入一条记录
end;
/
create or replace function get_avg_pay(num_deptno number) return number is--创建一个函数,该函数实现计算某个部门的平均工资,传入部门编号参数
  num_avg_pay number;--定义临时变量,保存某个部门的平均工资
begin
  select avg(sal) into num_avg_pay from emp where deptno=num_deptno;--获取某个部门的平均工资
  return(round(num_avg_pay,2));--返回平均工资
exception
  when no_data_found then --若此部门编号不存在
    dbms_output.put_line('该部门编号不存在');
    return(0); --返回平均工资为0
end;
/
create table dept_log
(
  operate_tag varchar2(10),            --定义字段,存储操作种类信息
  operate_time date                --定义字段,存储操作日期
);
create or replace trigger tri_dept
  before insert or update or delete
  on dept --创建触发器,当dept表发生插入,修改,删除操作时引起该触发器执行
declare
  var_tag varchar2(10);--声明一个变量,存储对dept表执行的操作类型
begin
  if inserting then --当触发事件是INSERT时
    var_tag := '插入';--标识插入操作
  elsif updating then --当触发事件是UPDATE时
    var_tag := '修改';--标识修改操作
  elsif deleting then--当触发事件是DELETE时
    var_tag := '删除';--标识删除操作
  end if;
  insert into dept_log
  values(var_tag,sysdate);--向日志表中插入对dept表的操作信息
end tri_dept;
/
 create table goods
(
  id int primary key,
  good_name varchar2(50)
);
create sequence seq_id;
create or replace trigger tri_insert_good
  before insert
  on goods --关于goods数据表的id,在插入id列之前,引起该触发器的运行
  for each row --创建行级触发器
begin
  select seq_id.nextval
  into :new.id
  from dual;--从序列中生成一个新的数值,赋值给当前插入行的id列
end;
/
create view view_emp_dept
  as select empno,ename,dept.deptno,dname,job,hiredate
     from emp,dept
     where emp.deptno = dept.deptno;
create or replace trigger tri_insert_view
  instead of insert
  on view_emp_dept--创建一个关于view_emp_dept视图的替换触发器
  for each row--是行级视图
declare
  row_dept dept%rowtype;
begin
  select * into row_dept from dept where deptno = :new.deptno;--检索指定部门编号的记录行
  if sql%notfound then--未检索到该部门编号的记录
     insert into dept(deptno,dname)
     values(:new.deptno,:new.dname);--向dept表中插入数据
  end if;
  insert into emp(empno,ename,deptno,job,hiredate)
  values(:new.empno,:new.ename,:new.deptno,:new.job,:new.hiredate);--向emp表中插入数据
end tri_insert_view;
/
create table ddl_oper_log
(
  db_obj_name varchar2(20),--数据对象名称
  db_obj_type varchar2(20),--对象类型
  oper_action varchar2(20),--具体dll行为
  oper_user varchar2(20),--操作用户
  oper_date date--操作日期
);
create or replace trigger tri_ddl_oper
  before create or alter or drop
  on scott.schema --在scott模式下,在创建、修改、删除数据对象之前将引发该触发器运行
begin
  insert into ddl_oper_log values(
    ora_dict_obj_name,--操作的数据对象名称
    ora_dict_obj_type,--对象类型
    ora_sysevent,--系统事件名称
    ora_login_user,--登录用户
    sysdate);
end;
/
create or replace package pack_emp is
  function fun_avg_sal(num_deptno number) return number;--该函数用于获取指定部门的平均工资
  procedure pro_regulate_sal(var_job varchar2,num_proportion number);--该存储过程实现按照指定比例上调指定职务的工资
end pack_emp;
/
create or replace package body pack_emp is
  function fun_avg_sal(num_deptno number) return number is  --引入“规范”中的函数
    num_avg_sal number;--定义内部变量
  begin
    select avg(sal)
    into num_avg_sal
    from emp
    where deptno = num_deptno;--计算某个部门的平均工资
    return(num_avg_sal);--返回平均工资
  exception
    when no_data_found then--若未发现记录
      dbms_output.put_line('该部门编号不存在雇员记录');
    return 0;--返回0
  end fun_avg_sal;

  procedure pro_regulate_sal(var_job varchar2,num_proportion number) is--引入“规范”中的存储过程
  begin
    update emp
    set sal = sal*(1+num_proportion)
    where job = var_job;--为指定的职务调整工资
  end pro_regulate_sal;
end pack_emp;
/

   
     
  
set serveroutput on
declare
  num_deptno emp.deptno%type;--定义部门编号变量
  var_job emp.job%type;--定义职务变量
  num_avg_sal emp.sal%type;--定义工资变量
  num_proportion number;--定义工资调整比例变量
begin
  num_deptno:=10;--设置部门编号为10
  num_avg_sal:=pack_emp.fun_avg_sal(num_deptno);--计算部门编号为10的平均工资
  dbms_output.put_line(num_deptno||'号部门的平均工资是:'||num_avg_sal);--输出平均工资
  
  var_job:='SALESMAN';--设置职务名称
  num_proportion:=0.1;--设置调整比例
  pack_emp.pro_regulate_sal(var_job,num_proportion);--调整指定部门的工资
end;
/
create or replace function get_avg_pay(var_job varchar2) return number is--创建一个函数,该函数实现计算某个职务的平均工资,传入职务名称参数
  num_avg_pay number;--定义临时变量,保存某个职务的平均工资
begin
  select avg(sal) into num_avg_pay from emp where job=var_job;--获取某个部门的平均工资
  return(round(num_avg_pay,2));--返回平均工资
exception
  when no_data_found then --若此职务不存在
    dbms_output.put_line('该职务不存在');
    return(0); --返回平均工资为0
end;
/
create or replace trigger about_job_trigger
  before update or insert of job
  on emp
  for each row
begin
  if updating then
     :new.job:=upper(:new.job);
  else
    :new.job:=upper(:new.job);
  end if;
end;
/

猜你喜欢

转载自www.cnblogs.com/tszr/p/12206651.html