oracle 触发器 merge,[OT]函数|过程|触发器|插入(insert)|修改(Merge)
CREATE TABLE errlog
(Errcode NUMBER,Errtext CHAR(40));
--1,创建函数:
CREATE OR REPLACE
FUNCTION get_salary (p_deptno NUMBER ) RETURN NUMBER AS v_sal NUMBER;
BEGIN
IF p_deptno IS NULL THEN
RAISE_APPLICATION_ERROR(-20991,'Department number is null');
ELSIF p_deptno < 0 THEN
RAISE_APPLICATION_ERROR(-20992,'Invalide department number');
ELSE
SELECT SUM(sal) INTO v_sal FROM EMP WHERE deptno=p_deptno;
RETURN v_sal;
END IF;
END;
--2,打开包得输出output
SET SERVEROUTPUT ON
--3,调用函数
DECLARE
v_salary NUMBER(7,2);
v_sqlcode NUMBER;
v_sqlerr VARCHAR2(512);
Null_deptno EXCEPTION;
Invalid_deptno EXCEPTION;
PRAGMA EXCEPTION_INIT(null_deptno,-20991);
PRAGMA EXCEPTION_INIT(invalid_deptno,-20992);
BEGIN
v_salary :=get_salary(10);
DBMS_OUTPUT.PUT_LINE('10 department salary is :'||TO_CHAR(v_salary));
BEGIN
v_salary :=get_salary(-10);
EXCEPTION
WHEN invalid_deptno THEN
v_sqlcode := SQLCODE;
v_sqlerr := SQLERRM;
INSERT INTO errlog
(errcode,errtext) VALUES
(v_sqlcode,v_sqlerr);
COMMIT;
END inner1;
v_salary :=get_salary(20);
DBMS_OUTPUT.PUT_LINE('20 department salary is:' ||TO_CHAR(v_salary));
BEGIN
v_salary :=get_salary(NULL);
END inner2;
v_salary :=get_salary(30);
DBMS_OUTPUT.PUT_LINE('30 department salary is :'||TO_CHAR(v_salary));
EXCEPTION
WHEN null_deptno THEN
v_sqlcode :=SQLCODE;
v_sqlerr :=SQLERRM;
INSERT INTO errlog
(errcode,errtext
) VALUES
(v_sqlcode,v_sqlerr
);
COMMIT;
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Other errores!');
END outer;
--4,创建存储过程
create or replace PROCEDURE Get_emp_rec(Emp_number IN EMP.empno%TYPE,
Emp_ret OUT Emp%ROWTYPE) IS
BEGIN
select * into Emp_ret
FROM emp Where Empno=Emp_number;
end;
--5,调用存储过程
declare
emp_number int :=7900;
emp_ret emp%rowtype;
begin
get_emp_rec(emp_number,emp_ret);
dbms_output.put_line(emp_ret.ename);
end;
--6,触发器
create table emp_test as select * from emp;
create table emp_test1 as select * from emp;
CREATE OR REPLACE TRIGGER del_emp
BEFORE DELETE OR UPDATE ON scott.emp_test1 FOR EACH ROW
BEGIN
INSERT INTO emp_test(deptno , empno, ename , job ,mgr , sal , comm , hiredate )
VALUES( :old.deptno, :old.empno, :old.ename , :old.job,
:old.mgr, :old.sal, :old.comm, :old.hiredate );
END;
--7,测试触发器
select * from emp_test1;
delete from emp_test1 where deptno=20;
commit;
select count(*) from emp_test;
--8,视图触发器
create or replace view emp_view as
select deptno,count(*) total_employeer,sum(sal) total_salary
from emp_test group by deptno;
select * from emp_view;
CREATE OR REPLACE TRIGGER emp_view_delete
INSTEAD OF DELETE ON emp_view FOR EACH ROW
BEGIN
DELETE FROM emp_test WHERE deptno= :old.deptno;
END emp_view_delete;
--9,测试视图触发器
delete from emp_view where deptno=10;
commit;
select * from emp_test;
--10,登录触发器
create table logtable(username varchar2(50),logindate date);
create or replace trigger login_his
after logon on database
begin
insert into logtable
values(user,sysdate);
end;
--11,包定义
CREATE OR REPLACE package DXJF_MGR
AS
time1 number(10) := 0;
type cursorref_t is ref cursor;
type r_rate_t is record
(
no NUMBER(10),
rate NUMBER(10),
starttime date,
endtime date,
timespanid NUMBER(10)
);
type array_rate_t IS VARRAY(100) OF r_rate_t;
function f_is2day(dt date,duration number) return number;
procedure p_test(p_result in number :=0);
END DXJF_MGR;
--12,程序类型 :函数 判断通话时间否跨越2天
CREATE OR REPLACE FUNCTION f_is2day(dt date,duration number)
return number
is
v_date1 varchar2(10);
v_date2 varchar2(10);
v_date3 date;
v_date4 date;
i_day number(10);
begin
select (dt+duration/24/60/60) into v_date3 from dual;
select trunc(dt+1,'J') into v_date4 from dual;
if v_date3<=v_date4 then
return 0;
else
return 1;
end if;
end;
--13,Unconditional INSERT ALL
create table sal_history as select empno,hiredate,sal from emp where 1=0;
create table mgr_history as select empno,mgr,sal from emp where 1=0;
insert all
into sal_history values(empno,hiredate,sal)
into mgr_history values(empno,mgr,sal)
select empno,hiredate,mgr,sal from emp
where empno >800
select * from sal_history;
select * from mgr_history;
--14,Conditional INSERT ALL
create table sal_history as select empno,hiredate,sal from emp where 1=0;
create table mgr_history as select empno,mgr,sal from emp where 1=0;
INSERT ALL
WHEN SAL > 3000 THEN
INTO sal_history VALUES(empno,hiredate,sal)
WHEN MGR > 4000 THEN
INTO mgr_history VALUES(empno,mgr,sal)
select empno,hiredate,mgr,sal from emp
WHERE empno > 1000;
truncate table sal_history;
truncate table mgr_history;
select * from sal_history;
select * from mgr_history;
select * from emp;
--15,Conditional INSERT FIRST
create table special_sal as select deptno,sal from emp where 1=0;
create table hiredate_history_00 as select deptno,hiredate from emp where 1=0;
create table hiredate_history_99 as select deptno,hiredate from emp where 1=0;
create table hiredate_history as select deptno,hiredate from emp where 1=0;
insert first
when sal > 10000 then
into special_sal values(DEPTID,SAL)
when HIREDATE like('%00%')THEN
INTO hiredate_history_00 values(DEPTID,HIREDATE)
when hiredate like('%99%')THEN
into hiredate_history_99 values(deptid,hiredate)
else
INTO hiredate_history values(DEPTID,HIREDATE)
select deptno deptid,sum(sal) sal,max(hiredate)HIREDATE
from emp
group by deptno;
select * from special_sal;
select * from hiredate_history_00
select * from hiredate_history_99
select * from hiredate_history
--16,Pivoting insert
create table sales_source_data (employee_id number(6),week_id number(2),
sales_mon number(8,2),sales_tue number(8,2),sales_wed number(8,2),
sales_thur number(8,2),sales_fri number(8,2));
insert into sales_source_data values (176,6,2000,3000,4000,5000,6000);
commit;
select * from sales_source_data;
create table sales_info(employee_id number(6),week number(2),sales number(8,2));
insert all
INTO sales_info VALUES (employee_id,week_id,sales_MON)
INTO sales_info VALUES (employee_id,week_id,sales_TUE)
INTO sales_info VALUES (employee_id,week_id,sales_WED)
INTO sales_info VALUES (employee_id,week_id,sales_THUR)
INTO sales_info VALUES (employee_id,week_id,sales_FRI)
select EMPLOYEE_ID,week_id,sales_MON,sales_TUE,
sales_WED,sales_THUR,sales_FRIfrom sales_source_data;
select * from sales_info;
create table tmp2 as select * from emp;
delete from emp2 where rownum<10;
commit;
--17,MERGE Statement
create table emp2 as select * from emp;
MERGE INTO emp2 e2
USING emp e
ON (e2.empno = e.empno)
WHEN MATCHED THEN
UPDATE SET
e2.ename = e.ename,
e2.job = e.job,
e2.mgr = e.mgr,
e2.sal = e.sal,
e2.comm = e.comm,
e2.deptno = e.deptno
WHEN NOT MATCHED THEN
INSERT VALUES(e.empno, e.ename, e.job,e.mgr, e.hiredate, e.sal, e.comm,e.deptno);
select count(*) from emp2;
--18,MERGE Statement
create table orders_master (order_id int,order_total number(10));
create table monthly_orders (order_id int,order_total number(10));
insert into orders_master values (1,1000);
insert into orders_master values (2,2000);
insert into orders_master values (3,3000);
insert into orders_master values (4,null);
insert into monthly_orders values (2,2500);
insert into monthly_orders values (3,null);
merge into orders_master o
using monthly_orders m on (o.order_id=m.order_id)
when matched then
update set o.order_total=m.order_total
delete where (m.order_total is null)
when not matched then
insert values (m.order_id,m.order_total);
select * from orders_master;
select * from monthly_orders;
select * from orders_master;
oracle 触发器 merge,[OT]函数|过程|触发器|插入(insert)|修改(Merge)相关推荐
- Oracle 表类型-表值函数-过程 -例子
-------------函数---------------- create or replace function fun1(i_v Int) return GETCYCLEVALUE_OBJ_T ...
- oracle 增加列 生效,oracle基础(表的创建,插入,修改,增加,列的问题)
创建表 create table tb_user( user_name varchar2(40) not null, user_sex varchar2(10) not null, user_age ...
- Oracle 11g_过程、函数、触发器和包(6)
1.存储过程 存储过程是一种命名的PL/SQL块,它既可以没有参数,也可以有若干参数输入,输出参数,甚至可以有多个既作为输入又作为输出的参数,但它通常没有返回值. 存储过程被保存在数据库中,它不可以被 ...
- SQL语言之DML语言学习(一) 数据插入与修改操作语言
数据操作语言: 插入: insert 修改: update 删除:delete -.插入语句 方式一 语法: insert into表名(列名,-) values(值1,- ) ; INSERT IN ...
- 视频教程-赵强老师:Oracle数据库从10g到11g(5)过程、函数和触发器-Oracle
赵强老师:Oracle数据库从10g到11g(5)过程.函数和触发器 毕业于清华大学,拥有超过13年的工作经验. Oracle认证讲师,拥有6年以上授课经验.精通Oracle数据库.中间(Weblog ...
- oracle学习总结2(pl/sql 游标 异常的处理 存储过程和函数 包 触发器)
pl/sql的学习 给sql添加了逻辑判断与流程控制的功能 语法: declare begin exception end; 运算符 重要的就是赋值运算符了:= 连接 || ...
- oracle触发器函数,oracle 存储过程、函数和触发器用法实例详解
本文实例讲述了oracle 存储过程.函数和触发器用法.分享给大家供大家参考,具体如下: 一.存储过程和存储函数 指存储在数据库中供所有用户程序调用的子程序叫存储过程.存储函数. 创建存储过程 用CR ...
- oracle生成主键函数,Oracle学习记录之使用自定义函数和触发器实现主键动态生成...
很早就想自己写写Oracle的函数和触发器,最近一个来自课本的小案例给了我这个机会.现在把我做的东西记录下来,作为一个备忘或者入门的朋友们的参考. 案例介绍: 招投标管理系统(数据库设计). 数据表有 ...
- Oracle-存储过程、存储函数、触发器
Oracle-存储过程.存储函数.触发器 目录 文章目录 1.存储过程 1.1.概念 1.2.创建语法 1.3.实例 2.存储函数 3.out类型参数 4.存储过程与存储函数直接的区别 3.触发器 * ...
最新文章
- 蓝凌ekp开发_蓝凌EKP8.0产品白皮书(简).doc
- 学术青年如何克服拖延症——5条技巧助你前进
- 【UVA/Codeforces】1584 Circular Sequence / 792B Counting-out Rhyme(就是一个圈儿...)
- Oracle IMP-00403
- centos 6 上安装l7 filter尝试过滤xunlei
- python基础指令-python的一些基本命令
- 【Henu ACM Round#17 D】Hexagons!
- oracle表格颜色,如何在oracle中使用光标更新特定颜色
- BLE简介和Android BLE编程
- c语言构造数据类型有,《c语言程序设计基础7构造数据类型.ppt
- 纯CSS实现锚点跳转位置上下偏移的办法
- linux标准I/O——流的相关操作
- 普惠数据科学应用,九章云极携手伙伴共探智慧未来
- 如何系统学习python
- python分析服务器日志_python实现web服务器日志分析脚本
- java复习系列[2] - Java多线程
- java 获取jboss路径_java中获取文件路径的几种方式
- 小程序-demo:快速开始
- android 信号检测,卫星、手机信号都能测!安卓神器你值得拥有
- Java大鱼吃小鱼游戏,今天你吃了吗?
热门文章
- CentOS系列启动流程和内核原理(5系列,6系列,7系列)
- maven-settings.xml的那些事
- android 获取应用的资源id和uri
- 安防监控产业链全景梳理
- PAFF 和MBAFF
- C++字符输入getchar()和字符输出putchar()
- 第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波15 - 锐化高通滤波器 -拉普拉斯核(二阶导数)
- 浅谈session,cookie,sessionStorage,localStorage的区别及应用场景
- .net 技术类网址
- 洛谷 1226 取余运算||快速幂