Oracle 11g 学习笔记-6(触发器、函数、存储过程、程序包)

程序包

1-pack_body_emp 、exec_package

SQL> CREATE OR REPLACE PACKAGE pack_emp IS
  2    FUNCTION fun_avg_sal(num_deptno NUMBER) RETURN NUMBER;
  3
  4    PROCEDURE pro_regulate_sal(var_job VARCHAR2,num_proportion NUMBER);
  5
  6  END pack_emp;
  7  /

程序包已创建。
SQL> CREATE OR REPLACE PACKAGE BODY pack_emp IS
  2         FUNCTION fun_avg_sal(num_deptno NUMBER) RETURN NUMBER IS
  3           num_avg_sal NUMBER;
  4           BEGIN
  5             SELECT AVG(sal) INTO num_avg_sal
  6             FROM emp
  7             WHERE deptno=num_deptno;
  8             RETURN (num_avg_sal);
  9           EXCEPTION
 10             WHEN no_data_found THEN
 11               dbms_output.put_line('该部门不存在雇员记录');
 12               RETURN 0;
 13           END fun_avg_sal;
 14
 15           PROCEDURE pro_regulate_sal(var_job VARCHAR2,num_proportion NUMBER) IS
 16           BEGIN
 17             UPDATE emp SET sal=sal*(1+num_proportion)
 18             WHERE job=var_job;
 19           END pro_regulate_sal;
 20  END pack_emp;
 21  /

程序包体已创建。
//执行程序包
SQL>  declare
  2      num_deptno emp.deptno%type;
  3      var_job emp.job%type;
  4      num_avg_sal emp.sal%type;
  5      num_proportion number;
  6    begin
  7      num_deptno:=10;
  8      num_avg_sal:=pack_emp.fun_avg_sal(num_deptno);
  9      dbms_output.put_line(num_deptno||'号部门的平均工资是:'||num_avg_sal);
 10
 11      var_job:='SALESMAN';
 12      num_proportion:=0.1;
 13      pack_emp.pro_regulate_sal(var_job,num_proportion);
 14    end;
 15    /

触发器

2-[触发器] 语句级触发器:

SQL> create table dept_log(operate_tag varchar2(10),operate_time date);

表已创建。

SQL> create or replace trigger tri_dept
  2    before insert or update or delete
  3    on dept
  4  declare
  5    var_tag varchar2(10);
  6  begin
  7    if inserting then
  8      var_tag:='插入';
  9    elsif updating then
 10      var_tag:='修改';
 11    elsif deleting then
 12      var_tag:='删除';
 13    end if;
 14    insert into dept_log values(var_tag,sysdate);
 15  end tri_dept;
 16  /

触发器已创建
SQL> insert into dept values(66,'咨询''长春');

已创建 1 行。

SQL> commit;

提交完成。

SQL> select * from dept_log;

OPERATE_TA OPERATE_TIME
---------- --------------
插入       09-7-20

3-[触发器]tri_insert_good 行级触发器,自动创建主键值.

SQL> create table goods
  2  (
  3    id int primary key,
  4    good_name varchar2(50)
  5  );

表已创建。

SQL> create sequence seq_id;

序列已创建。
SQL> create or replace trigger tri_insert_good
  2    before insert
  3    on goods
  4    for each row
  5  begin
  6    select seq_id.nextval
  7    into :new.id
  8    from dual;
  9  end;
 10  /

触发器已创建
SQL> insert into goods(good_name)values('苹果');

已创建 1 行。

SQL> insert into goods(good_name)values('葡萄');

已创建 1 行。

SQL> select * from goods;

        ID GOOD_NAME
---------- --------------------------------------------------
         1 苹果
         2 葡萄

函数

4-[函数]create_func 代码手敲并调用函数 get_agv_pay…最后删除函数

SQL> create or replace function get_avg_pay(num_deptno number) return number is   --创建一个函数,计算某个部门的平均工资
  2    num_avg_pay number; --定义临时变量,保存某部门平均工资
  3  begin
  4    select avg(sal) into num_avg_pay from emp where deptno=num_deptno;--获取某部门平均工资
  5    return(round(num_avg_pay,2));--返回平均工资
  6  exception
  7    when no_data_found then
  8      dbms_output.put_line('该部门编号不存在!');
  9      return 0;
 10  end;
 11  /

函数已创建。
//调用函数
SQL> set serveroutput on
SQL> declare
  2  avg_pay number;
  3  begin
  4  avg_pay:=get_avg_pay(10);--调用get_avg_pay()函数
  5  dbms_output.put_line(avg_pay);
  6  end;
  7  /
2916.67

PL/SQL 过程已成功完成。
//删除函数
SQL> drop function get_avg_pay;

函数已删除。

存储过程

5-[存储过程]—无参存储过程 create_procedure…pro_insertDept

SQL> create or replace procedure pro_insertDept is
  2  begin
  3    insert into dept values(77,'市场拓展部','jilin');
  4    commit;
  5    dbms_output.put_line('插入新纪录成功!');
  6  end pro_insertDept;
  7  /

过程已创建。

6-show error 在sqlplus中可以显示编译错误么?
可以

SQL> create or replace procedure pro_insertDep1 is
  2  begin
  3    insert into dept values(77,'市场拓展部','jilin');
  4    commit;
  5    dbms_output.put_line('插入新纪录成功!');
  6  end pro_insertDept;
  7  /

警告: 创建的过程带有编译错误。

SQL> show error
PROCEDURE PRO_INSERTDEP1 出现错误:

LINE/COL ERROR
-------- -----------------------------------------------------------------
6/5      PLS-00113: END 标识符 'PRO_INSERTDEPT' 必须同 'PRO_INSERTDEP1'
         匹配 (在第 1,11)
// 调用存储过程
SQL> set serveroutput on
SQL> begin
  2  pro_insertDept;
  3  end;
  4  /
插入新纪录成功!

PL/SQL 过程已成功完成。

7-[存储过程] in_pro…insert_dept代码调用.带入参存储过程.

SQL> create or replace procedure insert_dept(
  2    num_deptno in number,
  3    var_ename in varchar2,
  4    var_loc in varchar2
  5    ) is
  6  begin
  7    insert into dept
  8    values(num_deptno,var_ename,var_loc);
  9    commit;
 10  end insert_dept;
 11  /

过程已创建。
SQL> begin
  2  insert_dept(var_ename=>'采购部',var_loc=>'成都',num_deptno=>15);
  3  end;
  4  /

PL/SQL 过程已成功完成。
SQL> select *from dept;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        66 咨询           长春
        77 市场拓展部     jilin
        15 采购部         成都
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
        88 design         beijing

已选择8行。

8-[存储过程]pro_out…select_dept代码手敲并调用.带入参+返参存储过程.

SQL> create or replace procedure select_dept(
  2    num_deptno in number,
  3    var_dname out dept.dname%type,
  4    var_loc out dept.loc%type
  5    ) is
  6  begin
  7    select dname,loc
  8    into var_dname,var_loc
  9    from dept
 10    where deptno=num_deptno;
 11  exception
 12    when no_data_found then
 13     dbms_output.put_line('该部门编号不存在!');
 14  end select_dept;
 15  /

过程已创建。
SQL> set serveroutput on
SQL>  declare
  2   var_dname dept.dname%type;
  3   var_loc dept.loc%type;
  4   begin
  5     select_dept(50,var_dname,var_loc);
  6     dbms_output.put_line(var_dname||'位于:'||var_loc);
  7   end;
  8  /
IT位于:HEFEI

PL/SQL 过程已成功完成。

9-[存储过程]default_value… insert_dept 带默认值入参存储过程,插入数据。

SQL> create or replace procedure insert_dept(
  2    num_deptno in number,
  3    var_dname  in varchar2 default '综合部',
  4    var_loc in varchar2 default '北京')is
  5  begin
  6    insert into dept values(num_deptno,var_dname,var_loc);
  7  end;
  8   /

过程已创建。
SQL> begin
  2    insert_dept(90);
  3  end;
  4  /

PL/SQL 过程已成功完成。
SQL> select * from dept;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        66 咨询           长春
        77 市场拓展部     jilin
        15 采购部         成都
        50 IT             HEFEI
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
        88 design         beijing
        90 综合部         北京

已选择10行。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值