Sql代码
  -- 限制员工的工资不能超过当前的高工资  
  create or replace trigger tr_emp_salary  
  -- update of 后面指定在那些列被改变时才调用这个触器,如果不加of 默认是所有列  
  before update of sal on emp  
  -- 指定该触发器为行级触发器  
  for each row  
  -- 如果要定义变量,则只能在Declare中定义  
  declare 
  maxSalary number(10,2);  
  begin 
  select max(sal) into maxSalary from emp;  
  if :new.sal > maxSalary then 
  raise_application_error(-20010,'员工工资超出工资上限!');  
  end if;  
  end;  
  / 
  Sql代码
  -- 设置员工的工资不能低于原工资,但也不能高出原工资的20%  
  create or replace trigger tr_emp_say
  before update of sal on emp
  for each row  
  -- 设置执行触发器的条件  
  when (new.sal < old.sal or new.sal > old.sal*1.2)  
  begin 
  raise_application_error(-20011,'员工的工资不能降薪,但工资升幅不能超过20%!');   
  end;  
  /
  对于上述触发器可以进行的一些操作:
  Sql代码
  -- 显示触发器  
  select trigger_name,status from user_triggers;  
  -- 禁止触发器  
  alter trigger tr_emp_salary disable;  
  -- 激活触发器  
  alter trigger tr_emp_salary enable;  
  -- 禁止表的所有触发器  
  alter table emp disable all triggers;  
  -- 激活表的所有触发器  
  alter table emp enable all triggers;  
  -- 重新编译触发器  
  --alter trigger tr_emp_salary compile;  
  -- 删除触发器  
  drop trigger tr_emp_salary; 
  知识点二、存储PL/SQL单元
  存储PL/SQL单元是存储过程、函数、包,有名字,可以调用,会被存储到数据库服务器的PL/SQL代码,数据字典中;子程序可以接收参数;包子程序:属于某个包;独立子程序:不属于任何包;函数有返回值。
  子程序参数有三种模式:
  in:传入参数,只能用于传入值,不能修改,调用时必须传值,该模式是默认模式
  out:传出参数,只能用于把值返回给调用者,不能用于接收值(接收不到值)
  in out:以上两种的结合
  知识点三、存储过程
  创建过程时,系统会对其进行编译,并将执行代码存储到数据库中。有名字,可接收参数,没有返回值。
  存储过程定义语法:
  create [or replace] procedure 过程名 [(参数名 参数模式 参数类型,...)] is|as
  [declaration]  --定义部分
  begin 
  --执行部分
  [exception] 
  --异常处理部分
  end [过程名];
  创建时不执行,调用时才执行。
  1.在SQL>提示符下调用过程,execute 过程名(参数 ...)
  2.在PL/SQL块中调用过程,过程名(参数 …),可独立作为PL/SQL语句
  可以在匿名块、其他的存储过程、函数中调用。
  存储过程中可以直接执行DML语句(select、insert、update、delete),不能直接执行DDL语句。
  存储过程中如需执行DDL语句,先把DDL语句存放在一个字符串变量中,然后通过execute immediate语句执行字符串内容,字符串内容必须符合SQL语法。用户从角色中获取的权限,在PL/SQL块中
  存储过程中创建触发器实现主键自增长:
  create or replace procedure pk_auto_increment_pro(t_name varchar2) is
  v_ddl varchar2(2000);
  begin
  v_ddl := 'create or replace trigger pk_auto_increment_' || t_name ||
  ' before insert on ' || t_name ||
  ' for each row
  begin
  dbms_output.put_line(''赋值前id:'' ||:new.id);
  select test_seq.nextval into :new.id from dual;
  dbms_output.put_line(''赋值后id:'' ||:new.id);
  end;';
  execute immediate v_ddl;
  end;
  知识点四、函数
  函数的编译号存放在数据库服务器的代码,必须有返回值。
  创建函数:
  create [or replace] function 函数名 [(参数列表)] return 返回值类型 is|as
  [local declarations] --定义部分
  begin
  --执行部分
  return 结果;       一定要有retutn,用于返回值
  exception
  --异常处理部分
  end;
  两种方式调用函数:
  1.在SQL>提示符下调用函数
  var varName 类型;           --定义变量
  call 函数名 into :varName;  
  print varName;
  2.在SQL语句、PL/SQL块中调用函数,不能作为独立的PL/SQL语句,参照表达式用法
  (表达式不是语句,可以作为其他语句的一部分)。
  知识点五、包
  包用于将相关的对象组合在一起,一个任务,需要多个函数或者过程协同才能完成,这时,可以这些函数和存储过程都放在一个包下,方便函数和存储过程的管理,提高程序的性能,在第一次用的时候,会全部读入内存,下次用直接从内存取,加强模块化。
  包分为两部分:
  1.包头(类似java接口)
  包的规范,只包含了函数或存储过程的说明部分
  创建包头语法:
  create [or replace] package 包名 is|as
  --函数定义
  function 函数名 [(参数列表)] return 返回类型;
  --存储过程定义
  procedure 存储过程名 [(参数列表)];
  end [包名];
  2.包体(类似java实现类)
  实现包头里定义的规范
  创建包体语法:
  create [or replace] package body 包名 is|as
  --函数实现
  function 函数名 [(参数列表)] return 返回类型 is|as
  函数实现内容
  --存储过程实现
  procedure 存储过程名 [(参数列表)] is|as
  存储过程实现内容
  end [包名];
  使用包子程序的时候,包名.子程序名。
  调用存储过程时,如果不需要传参,调用该过程的时候,可以加(),也可以不加。
  调用函数时,如果不需要传参,在SQL*Plus中运行,必须加(),其他不需要