Oracle之触发器 函数
来源:互联网 发布:手机破解压缩文件软件 编辑:程序博客网 时间:2024/05/01 12:30
--1.无参函数CREATE OR REPLACE FUNCTION func1 RETURN VARCHAR2 IS BEGIN RETURN '欢迎你:'||USER||',现在是:'||to_char(SYSDATE,'yyyy-mm-dd'); END func1;--调用测试 BEGIN dbms_output.put_line(func1);END;--有参函数SELECT * FROM emp;CREATE OR REPLACE FUNCTION getWorkTime(hiredate DATE) RETURN NUMBER ISBEGIN RETURN trunc(months_between(SYSDATE,hiredate)/12);END getWorkTime;SELECT ename,job,getWorkTime(hiredate) FROM emp;--触发器--语句触发器(select/insert/update/delete)CREATE OR REPLACE TRIGGER trg_dept BEFORE INSERT OR UPDATE OR DELETE ON dept DECLARE BEGIN dbms_output.put_line(USER||','||to_char(SYSDATE,'yyyy-mm-dd')||',对dept进行操作。'); END trg_dept;UPDATE dept SET dname='测试' WHERE deptno=60;INSERT INTO dept VALUES(23,'触发器','数据库');--行触发器(FOR EACH ROW)--before触发器--伪记录 :NEW :OLD--3个条件谓词:INSERTING UPDATING DELETINGCREATE OR REPLACE TRIGGER trg_dept_before BEFORE INSERT OR UPDATE OR DELETE ON dept FOR EACH ROWDECLARE v_now VARCHAR2(50);BEGIN v_now:=to_char(SYSDATE,'yyyy-mm-dd hh24:mi:ss'); CASE WHEN INSERTING THEN dbms_output.put_line(v_now||'对dept表进行了添加操作'); dbms_output.put_line('添加的数据:'||:new.deptno||','||:new.dname||','||:new.loc); WHEN UPDATING THEN dbms_output.put_line(v_now||'对dept表进行了修改操作'); dbms_output.put_line('修改之前的数据:'||:old.deptno||','||:old.dname||','||:old.loc); dbms_output.put_line('修改之后的数据:'||:new.deptno||','||:new.dname||','||:new.loc); WHEN DELETING THEN dbms_output.put_line(v_now||'对dept表进行了删除操作'); dbms_output.put_line('删除的数据:'||:old.deptno||','||:old.dname||','||:old.loc); END CASE;END trg_dept_before;INSERT INTO dept VALUES(24,'触发器4','数据库4');UPDATE dept SET dname='测试' WHERE deptno=24;DELETE FROM dept WHERE deptno=24;COMMIT;--实现SQL Server中标识列效果CREATE SEQUENCE seq_dept_deptno INCREMENT BY 1 START WITH 100 MAXVALUE 999999 NOCYCLE;--触发器(从序列里面取值,并且在insert语句进行使用CREATE OR REPLACE TRIGGER trg_dept_before_increment BEFORE INSERT ON dept FOR EACH ROWBEGIN SELECT seq_dept_deptno.nextval INTO :new.deptno FROM dual;END trg_dept_before_increment;INSERT INTO dept (dname,loc) VALUES('序列','序列');--INSERT INTO dept (deptno,dname,loc) VALUES(seq_dept_deptno.nextval,'序列','序列');COMMIT;SELECT * FROM dept;--使用after触发器记录数据操作日志CREATE TABLE dept_log( uname VARCHAR2(40), oper_time DATE, oper_type VARCHAR2(20), info VARCHAR2(100));CREATE OR REPLACE TRIGGER trg_dept_after AFTER INSERT OR DELETE ON dept FOR EACH ROWDECLARE v_info VARCHAR2(100);BEGIN CASE WHEN inserting THEN v_info:= :new.deptno||','||:new.dname||','||:new.loc; INSERT INTO dept_log VALUES(USER,SYSDATE,'insert',v_info); WHEN deleting THEN v_info:= :old.deptno||','||:old.dname||','||:old.loc; INSERT INTO dept_log VALUES(USER,SYSDATE,'delete',v_info); END CASE;END trg_dept_after;INSERT INTO dept VALUES(35,'sales','青岛');DELETE FROM dept WHERE deptno=35;COMMIT;SELECT * FROM dept_log;SELECT * FROM emp;--根据列进行触发update ofCREATE OR REPLACE TRIGGER trg_emp_sal_update BEFORE UPDATE OF sal ON emp FOR EACH ROWBEGIN IF :new.sal<:old.sal THEN dbms_output.put_line('职工工资不能向低调整.'); raise_application_error(-20009,'职工工资不能向低调整.'); END IF;END trg_emp_sal_update;UPDATE emp SET sal=10000 WHERE empno=7369;SELECT * FROM emp WHERE empno=7369;--按行触发(所有进行触发)whenCREATE OR REPLACE TRIGGER trg_emp_when AFTER INSERT OR DELETE ON emp FOR EACH ROW WHEN (new.deptno=10 AND new.deptno<=30)DECLARE v_info VARCHAR2(100);BEGIN CASE WHEN inserting THEN v_info:= :new.ename||','||:new.job||','||:new.sal; INSERT INTO dept_log VALUES(USER,SYSDATE,'insert',v_info); WHEN deleting THEN v_info:= :old.ename||','||:old.job||','||:old.sal; INSERT INTO dept_log VALUES(USER,SYSDATE,'delete',v_info); END CASE;END trg_emp_when;INSERT INTO emp VALUES(1111,'test1','test',1111,SYSDATE,1111,0,10);INSERT INTO emp VALUES(1112,'test2','test',1112,SYSDATE,1111,0,50);COMMIT;SELECT * FROM dept_log;ALTER TRIGGER trg_emp_when DISABLE;ALTER TRIGGER trg_emp_when ENABLE;SELECT * FROM user_triggers WHERE table_name='DEPT';--cmd 命令窗口 切换到C:\oracle\product\10.2.0\db_1\bin目录--导出:EXP scott/tiger BUFFER=64000 FILE=d:/scott.dmp--导入imp scott/tiger FILE=d:/scott.dmp FULL=y IGNORE=y
0 0
- Oracle之触发器 函数
- Oracle之函数与触发器
- Oracle之函数与触发器
- Oracle之函数与触发器
- Oracle之函数与触发器
- Oracle之异常/存储过程/函数/触发器
- Oracle函数与触发器
- oracle函数与触发器
- Oracle 10g要点整理之过程、函数、程序包、触发器
- Oracle数据库之视图、索引、存储过程、触发器、事务、函数
- oracle开发之触发器
- ORACLE之 触发器 TRIGGER
- oracle之触发器
- oracle之触发器
- ORACLE之触发器详解
- Oracle之触发器
- oracle自学之触发器
- Oracle中函数与触发器
- 升级Android L完后,打开项目出现'load data for Android L(preview)'has encountered a problem.
- 拓展欧几里得临时文档5
- [Linux]很方便的上传下载文件工具rz和sz
- 杭电1728————一直WA的BFS(有思维惯性带来的陷阱)
- 网络测试命令
- Oracle之触发器 函数
- 在 Mac OS X 终端里使用 Solarized 配色方案
- java wait()方法notifyAll()方法实现三个线程打印A,B,C字符
- IE6 PNG透明终极解决方案
- ffmpeg解复用视频文件
- C语言可变参数宏定义方法
- 怎么会有种新车报废的感觉 粉红色奥拓报废之旅
- Android四大组件之Activity
- Rotate Image