存储过程、存储函数、触发器

时间:2024-04-02 14:47:58

存储过程

存储过程定义
存储过程:是一组为了完成特定功能的SQL语句集,经过编译后存储在数据库中,可包含程序流、逻辑以及对数据库的传,我们 可以接受参数、输出参数、返回单个或者多个结果集以及返回值。
 简单来讲:在服务器端,能够被一个或者多个应用程序调用的一段SQL语句集。
优缺点:   
    1:存储过程与其他应用程序共享应用程序逻辑,因此确保了数据访问和修改的一致性。
    2:存储过程具有安全性和所有权链接,以及可以附加到他们的证书,用户可以被授予权限来执行存储过程而不必直接怼存储 过程中对的引用对象具有权限。
    3:存储过程提供了安全机制,即使是没有访问存储过程引用的表或者视图的权限的用户,也可以被授权改存储过程。
    4:存储过程允许模块化程序设计,存储过程一旦创建,以后即可在程序中调用任意多次。
    5:存储过程可以减少网络通讯流量,用户可以通过发送一个单独的语句实现一个复杂的操作,而不需要在网络上发送几百个Transact-SQL代码,这样减少了在服务器和客户之间的传递和请求的数量。
存储过程的写法:
    create or replace procedure  过程名(参数名 in 参数类型,参数名 out  参数类型) as 变量名 变量类型 :=值;
begin 
    SQL语句集
end;
注意事项:
 * 存储过程可以没有参数,如果没有参数则过程名之后不能出现括号
        * 存储过程可以有参数:
        传入参数用in标明,传出参数用out标明
        可以有多个传入参数,也可以有多个传出参数
        可以只有传入参数,也可以只有传出参数
       * 存储过程没有返回值,而是通过返回参数来返回数据的
       * 如果没有传入传出参数,过程名之后不能加()
实例
无参数的过程:
--实现从1+2+3+......+100的功能
create or replace  procedure pro_test
as
 x number := 1;
 y number := 0;
begin
 while x<=100 loop
 y := y+x;
 x := x+1;
 end loop;
end;

有参数的过程:
--如果传入参数为1的时候,则返回欢迎礼貌语句
--如果传入参数为2的时候,则返回再见礼貌语句;
create or replace  procedure
 pro_test(key in number,result out varchar)
as
begin
 if key=1 then result :='欢迎您';
 else if key=2 then result :='再见!';
 end if;
 end if;
end;
存储过程的调用执行:
1:在cmd中,execute 过程名。
2:declare快调用存储过程:
 declare
  变量 类型:= 初始值;
 begin
  过程名(参数,变量);
 end;

存储函数

其实存储函数和存储过程基本差不多,上面对存储过程进行了较为详细的介绍,对存储函数不多介绍,只是句式上面少有不同,有返回结果。

实例:

 CREATE OR REPLACE
FUNCTION fn_test(key in number) RETURN  VARCHAR2
AS
    result VARCHAR2(32);
BEGIN
    if key=1 then result := '欢迎您';
               else if key=2 then result := '再见!';
            end if;
          end if;
    RETURN result;
END;

触发器 (trigger)

介绍:
 触发器其实就是一个特殊的存储过程
  存储过程:需要调用
  触发器:   自动执行
 触发器中没有参数
 在insert的触发器中只能使用new关键字
在delete的触发器中只能使用old关键字
 在update的触发器中可以使用new,也可使用old关键字
 for each row :行级触发器的标志
  如果没有这句话则表示每次操作只执行begin end之间的内容
  带有for  each  row 的触发器称为行级触发器
  不带有for  each  row 的触发器称为表级触发器
触发器的写法:
 create or replace trigger  触发器名
  before/after    insert/update/delete on 表名
  [for each row]
 begin
  SQL语句集
 end;
触发器的种类:
 before insert on 表名 for each row
 before update on 表名 for each row
 before delete on 表名 for each row
 after insert on 表名 for each row
 after update on 表名 for each row
 after delete on 表名 for each row
 before insert on 表名
 before update on 表名
 before delete on 表名
 after insert on 表名
 after update on 表名
 after delete on 表名

案例:
 --向test表中插入数据时,将插入的数据存储到testa表中(数据备份)
 create trigger tri_test
     before insert on test
     for each row
 begin
              insert into testa(id,product,price,type)
             values(new.id,new.product,new.price,new.type);
 end;
也可以在工具中添加(Navicat)
 1:在表上右键,找到设计表
 2:点击触发器按钮
存储过程、存储函数、触发器
 (如图所示,填写触发器名称,在触发一栏选择before、after,然后选择触发时机插入、更新、删除)
 3:定义触发器
存储过程、存储函数、触发器

 4:保存结束