首页 > 数据库 >oracle函数、包、触发器

oracle函数、包、触发器

时间:2022-11-30 18:04:03浏览次数:55  
标签:触发器 NULL END 函数 sal number comm oracle total


1、

函数:必须有返回值,函数必须用基本数据类型
CREATE FUNCTION 函数的名字 (  参数列表 )
RETURN TYPENAME
IS
        变量的声明
BEGIN
      过程语句
END

SELECT COMM + SAL FROM EMP;

CREATE OR REPLACE FUNCTION add_number (  
    p_comm number , p_sal number
)
RETURN number
IS
        v_total number( 6,2 );
BEGIN
      IF p_sal IS NULL AND p_comm IS NOT NULL THEN
                v_total := p_comm ;
        ELSIF p_sal IS NOT NULL AND p_comm IS NULL THEN
                v_total := p_sal;
        ELSE
                v_total := p_comm + p_sal ;
        END IF;
        
        RETURN v_total;
END;

select add_number(comm , sal) ,
    empno , ename from emp;

  2、
包:和命名空间差不多   ERP( A1     A2   )
包头   包体

CREATE OR REPLACE PACKAGE pkg_A1
IS
    FUNCTION add_number (  
        p_comm number , p_sal number
    ) RETURN number ;
    
    PROCEDURE USP_GETSAL2
    ( i_deptno IN NUMBER , io_sal IN OUT NUMBER );
END;

--创建包体
CREATE OR REPLACE PACKAGE BODY pkg_A1
IS

FUNCTION add_number (  
    p_comm number , p_sal number
)
RETURN number
IS
        v_total number( 6,2 );
BEGIN
      IF p_sal IS NULL AND p_comm IS NOT NULL THEN
                v_total := p_comm ;
        ELSIF p_sal IS NOT NULL AND p_comm IS NULL THEN
                v_total := p_sal;
        ELSE
                v_total := p_comm + p_sal ;
        END IF;
        
        RETURN v_total;
END add_number;    

PROCEDURE USP_GETSAL2
    ( i_deptno IN NUMBER , io_sal IN OUT NUMBER )
IS
    v_sal EMP.SAL%TYPE := 0.0;
BEGIN
    v_sal := io_sal;
    
    DBMS_OUTPUT.PUT_LINE( v_sal);
    
    SELECT AVG( SAL ) INTO io_sal FROM EMP
    WHERE DEPTNO = i_deptno;
END USP_GETSAL2;

END pkg_A1;

--调用方式是一样的,只不过前面加包名.对象调用

3、

--触发器
触发器就是特殊的存储过程,特殊在如下几点:
    (1) 不是显式调用,不是由程序员调用他的
    (2)触发器没有参数
    
触发器可以分为DML ( BEFORE , AFTER , INSTEADOF | 
    INSERT , UPDATE , DELETE)和DDL触发

CREATE OR  REPLACE TRIGGER trg_触发器名字
    [触发的时机BEFORE , AFTER , INSTEADOF] 
    | [INSERT , UPDATE DELETE]  ON 表名  
    触发级别[FOR EACH ROW]
BEGIN
    语句
END;

create  table sales
(
    sid number(4) primary key,
    gid number(4) ,
    snumber number(4)
)

create table goods
(
    gid number(4) primary key,
    gname varchar2(100),
    total number(4)
)

insert into goods values(1001 , '大白菜' , 100);
commit;

--((1)). 卖2斤白菜,那就是新增sales表,更新goods表

insert into sales values(1 , 1001 , 2);
commit;

select * from goods;

CREATE OR  REPLACE TRIGGER trg_insert_sales
    AFTER INSERT ON sales FOR EACH ROW
BEGIN
  UPDATE goods SET total = total - :NEW.snumber   
    WHERE gid = :NEW.GID ;
END;

((2))幽灵表

:NEW(存储的是我新添加的数据)  
:OLD(存储的是我删除的数据) 
更新的数据存储在什么地方?更新之前数据在:OLD
    里面存储,更新之后的数据在:NEW里面存储

--((3)) 卖2斤白菜,更新goods表,新增sales表
update goods set total = 98 where gid = 1001;

伪代码:
insert into sales values( seq.nextVal ,     :OLD.gid , :OLD.total - :NEW.total
)

-- 触发器实现自增序列
create  table t02
(
    tid number(4) primary key, --这一列是自增列
    tname varchar2(100)
)

create sequence seq_t02;

CREATE OR  REPLACE TRIGGER trg_insert_t02
    BEFORE INSERT ON t02 FOR EACH ROW
BEGIN
  :NEW.tid := seq_t02.nextVal;
END;

insert into t02(tname) values('张三丰');
commit;

select * from t02;

标签:触发器,NULL,END,函数,sal,number,comm,oracle,total
From: https://blog.51cto.com/u_12528551/5900085

相关文章

  • c语言文件操作函数应用(2) ——学习整理
    表头文件#include<stdio.h>字符读写函数1.      fgetc()(由文件中读取一个字符)【定义函数】intfgetc(FILE*stream);【函数说明】fgetc()从参数stream所指的文件中......
  • c语言文件操作函数应用(3) ——学习整理
    表头文件#include<stdio.h>1.读字符串函数fgets格式:fgets(字符数组名,n,文件指针);功能:从指定的文件中读一个字符串到字符数组中。说明:n表示从文件中读出的字符串不超过n-1......
  • mybatis 连接 oracle使用concat关键字模糊查询
    oracle中不支持concat的三个参数的拼接,需要更正为SELECT*FROM"t_Dormitorys"where"RoomName"likeCONCAT(CONCAT('%','1'),'%')......
  • maven ssm 连接oracle
    复制dependency到pom.xml中,并下载jar包(页面上有)mvninstall:install-file-Dfile=ojdc6.jar-DgroupId=com.oracle-DartifactId=ojdbc6-Dversion=11.2.0.3-Dpackaging=ja......
  • javascript函数的理解
    参考:https://www.liaoxuefeng.com/wiki/1022910821149312/1023021087191360在js里,函数是一等公民。函数可以分配给变量函数可以作为参数传递给其他函数函数可以从其他......
  • iTOP2k1000开发板Makefile基本语法-wildcard函数
    格式:$(wildcardPATTENR)功能:展开指定的目录举例:在/home/topeet/test目录有一个“a.c”的c文件和一个test的文件夹,在/home/topeet/test/test文件夹下有一个......
  • select_related和prefetch_related函数
    在数据库存在外键的其情况下,使用select_related()和prefetch_related()很大程度上减少对数据库的请求次数以提高性能在表中查找数据的时候,使用外键表related_name里面的值......
  • lambda 标准函数
    1、标准函数let,also,with,run和apply1)、let函数,必须让某个对象调用,接收一个Lambda表达式参数,Lambda表达式中的参数为当前调用者,且最后一行代码作为返回值2)、also函数......
  • 用递归函数实现反序输出正整数
    大家下午好呀,今天的分享就是我的作业啦,可能对一些大佬来说很基础,但是我经过综合多方意见,终于写出来啦首先是题目然后我们分析下这道题,一开始我是很懵逼的,不知道老师为啥要说......
  • linux卸载oracle
    目录linux卸载oracle1、停止监听服务2、停止运行服务3、删除安装目录4、删除/usr/local/bin/文件夹下的内容5、删除/etc/oratab6、删除用户及用户组7、卸载安装包linux......