• pl/sql基础之三


    一、触发器

    • 触发器定义:它是在执行update、delete、insert语句时,执行的一个plsql代码,它可以在sql执行前运行,sql执行后运行,也可以替换掉原有的sql语句。

    • 行级触发器:当表中一条数据发生改变,就会执行一次触发器代码。

    • 语句级触发器(表级):当执行一条sql语句,不管理sql语句改变了表中的多少条数据,只会执行一次触发器代码。

    1.表级触发器使用:无论操作多少次该表,表级触发器只会触发一次。   

          让触发器生效/失效:
                alter trigger 触发器名 enable/disable;

      create or replace tigger  名

      after / before  update or delete or insert on 表名;

      declare

      声明

      begin

      执行语句

      end;

    1. updating:布尔类型变量,如果是update语句它返回true,否则返回false
    2. deleting:布尔类型变量,如果是delete语句它返回true,否则返回false
    3. inserting:布尔类型变量,如果是insert语句它返回true,否则返回false

    例:

    create or replace TRIGGER tri4
    before UPDATE  on dept
    begin
        if updating THEN
            dbms_output.put_line('更新');
        end if;     
    end;

    2.行级触发器:多次操作表,多次触发

    create or replace tigger 名

    after/before update or delete or insert on 表名  for each row

    declare 

    声明

    begin

    执行

    exception

    异常处理

    end;

    例:

    CREATE OR REPLACE TRIGGER ti
    AFTER DELETE ON emp FOR EACH ROW
    BEGIN
      dbms_output.put_line('删除操作');
    END;

    3.替换触发器: 该触发器需要在视图上使用

    create or replace trigger 名 

    instead of  update or delete or insert  on 视图 for each row 

    deaclare 

    声明

    begin

    执行

    exception

    异常

    end;

    例:

    --对视图新增部门,如果有该部门,则修改部门名称
    CREATE OR REPLACE TRIGGER t 
    INSTEAD OF INSERT ON d FOR EACH ROW
    DECLARE
       v dept%ROWTYPE; 
       n NUMBER(2);--声明变量接收数量值用于判断是否存在该部门   
    BEGIN
       SELECT * INTO v FROM dept WHERE deptno = :new.deptno                      --:new  /  :old 可以用来保存删除的数据
       SELECT COUNT(*) INTO n FROM dept WHERE deptno = :new.deptno;
       IF n = 0 THEN
         INSERT INTO d VALUES(:new.deptno,:new.dname,:new.loc);
       ELSE 
         UPDATE d SET dname = :new.dname WHERE deptno = :new.deptno;
       END IF;
       EXCEPTION
         WHEN OTHERS THEN
           dbms_output.put_line(SQLERRM);
    END;

    二、包

    包:它是将一些功能或业务相似的函数、存储过程封装到一起,
    统一调用,包含存储过程、函数、变量、常量等对象
    包分为声名部分和实现部分(包体),对外只提供包声名中包含的对象

    包的声名:
    create or replace package 包名
    is
    --声名类型集合类型,记录类型、游标类型等
    --声名变量
    变量名 类型名
    --声名常量
    常量名 constant 类型名:=常量值;
    --声名存储过程
    procedure 存储过程名;
    --声名函数
    function 函数名 return 返回值类型;
    end 包名;

    --包名
    create or replace package pk1
    is
       --声名一个常量
       PI constant number(10,9):=3.1415926;
       --声名一个存储过程
       procedure p1;
       --声名一个函数
       function f1(r number) return number;
    end pk1;
    
    --包体
    create or replace package body pk1
    is
       --私有对象只能在包体的内容使用,而且一般定义在所有公有对象的前面
       --声名私有变量
          --私有函数
        function f2
          return number
          is
          begin
             return 1;
          end;
        --私有存储过程
        procedure p2
          is
          begin
            dbms_output.put_line('Hello World');
          end;
       --存储过程的实现
       procedure p1 
         is
         begin
             p2();  --在包实现中调用的私有对象必须在当前对象的前面定义
             for i in 1..9 loop
                for j in 1..i loop
                   dbms_output.put(i||'*'||j||'='||i*j||' ');
                   if i*j<10 then
                     dbms_output.put(' ');
                   end if;
                end loop;
                dbms_output.put_line('');
             end loop;
         end;
       --函数的实现
       function f1(r number)
         return number
         is
            res number(15,5);
         begin
            res:=power(r,2)*PI;
            return res;
         end;
      
    end pk1;
    
    --调用
    begin
       dbms_output.put_line(pk1.PI);
    end;
    begin
      pk1.p1;
    end;
    begin
      dbms_output.put_line(pk1.f1(2));
    end;
    begin
      pk1.p2; --包中私有对象在外部是不可调用的
    end;
  • 相关阅读:
    MSI文件的制作
    QPushButton 响应回车 设置默认按钮
    ubuntu 使用apt-fast 安装软件包
    apt命令集使用教程
    如何在windows下使用git及github仓库管理项目
    如何在windows下使用git及github仓库管理项目
    01. struts2介绍
    人生能跨越多少个年代
    联调踩的坑:空和空字符串引发的巨大差异
    我的亲历:一行代码,百万人民币打水漂
  • 原文地址:https://www.cnblogs.com/zsf-note/p/11134884.html
Copyright © 2020-2023  润新知