oracle 触发器简单应用

触发器定义:
触发器在数据库里以独立的对象存储,它与存储过程不同的是,存储过程通过其它程序来启动运行或直接启动运行,而触发器是由一个事件来启动运行。即触发器是当某个事件发生时自动地隐式运行。并且,触发器不能接收参数。
触发器(主要)组成:
触发事件:即在何种情况下触发TRIGGER; 例如:INSERT, UPDATE, DELETE。
触发时间:即该TRIGGER 是在触发事件发生之前(BEFORE)还是之后(AFTER)触发,也就是触发事件和该TRIGGER 的操作顺序。
触发频率:说明触发器内定义的动作被执行的次数。即语句级(STATEMENT)触发器和行级(ROW)触发器。
        语句级(STATEMENT)触发器:是指当某触发事件发生时,该触发器只执行一次;
        行级(ROW)触发器:是指当某触发事件发生时,对受到该操作影响的每一行数据,触发器都单独执行一次。
触发器本身:即该TRIGGER 被触发之后的目的和意图,正是触发器本身要做的事情。 例如:PL/SQL 块。
触发器一般语法:
创建语法是 :
    
CREATE  TRIGGER trigger_name (触发器名字)            {BEFORE | AFTER }(前/后触发 (选一个))
            
{INSERT | DELETE | UPDATE [OF column [, column …]]}
 ON [schema.] table_name
(触发条件是什么DML事件)
[REFERENCING {OLD [AS] old | NEW [AS] new| PARENT as parent}]
    
[FOR EACH ROW ]
    
[WHEN condition]
    
trigger_body;
 
每张表最多可创建12种触发器:

BEFORE INSERT

BEFORE INSERT FOR EACH ROWA
FTER INSERT

AFTER INSERT FOR EACH ROW

BEFORE UPDATE

BEFORE UPDATE FOR EACH ROW
AFTER UPDAT
EAFTER UPDATE FOR EACH ROW

BEFORE DELETE

BEFORE DELETE FOR EACH ROW

AFTER DELETE
AFTER DELETE FOR EACH ROW
触发器执行的顺序是:
1.执行 BEFORE语句级触发器  对与受语句影响的每一行:

  1.1执行 BEFORE行级触发器

  1.2执行 DML语句

  1.3执行 AFTER行级触发器

2.执行 AFTER语句级触发器
创建触发器举例:
CREATE OR REPLACE TRIGGER del_emp
       
BEFORE DELETE ON scott.emp FOR EACH ROW
        
BEGIN
                   --   将修改前数据插入到日志记录表 del_emp ,以供监督使用。
                   
INSERT INTO emp_his(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;
触发器的限制:
CREATE TRIGGER语句文本的字符长度不能超过32KB

触发器体内的SELECT 语句只能为SELECT … INTO …结构,或者为定义游标所使用的SELECT 语句 触发器中不能使用数据库事务控制语句 COMMIT, ROLLBACK, SVAEPOINT 语句
由触发器所调用的过程或函数也不能使用数据库事务控制语句

触发器中不能使用LONG, LONG RAW 类型
触发器内可以参照LOB类型列的列值,但不能通过 :NEW 修改LOB列中的数据
行级别触发器中的相关标识符 :
  当触发器被触发时,要使用被插入、更新或删除的记录中的列值,有时要使用操作前、后列的值 ,可以使用:  :NEW  修饰符访问操作完成后列的值
:OLD  修饰符访问操作完成前列的值
删除触发器使用下面的语句:
                DROP TRIGGER trigger_name;
当删除其他用户模式中的触发器名称,需要具有DROP ANY TRIGGER系统权限,
当删除建立在数据库上的触发器时,用户需要具有ADMINISTER DATABASE TRIGGER系统权限。此外,当删除表或视图时,建立在这些对象上的触发器也随之删除


select * from emp;
--创建触发器
CREATE TRIGGER del_empA
           BEFORE update or insert or delete  ON scott.emp   --触发器触发的满足情况
         REFERENCING new AS nn  old AS oo 
         FOR EACH ROW   --创建行触发器要写;如果是表触发器则不需要.
        -- WHEN (nn.sal > 20)
     BEGIN
          dbms_output.put_line(:nn.sal||'------'||:oo.sal); --触发器的函数体
     END;
     

--插入数据
insert into emp
values(0001,'zwi','it',222,to_date('1888-9-3','yyyy-mm-dd'),90000,null,20);
--修改数据
update emp
set job='it',sal=900
where empno=1;
--删除数据
delete emp where empno=1;
--删除触发器
drop TRIGGER  del_empA;




























使用优化算法,以优化VMD算法的惩罚因子惩罚因子 (α) 和分解层数 (K)。 1、将量子粒子群优化(QPSO)算法与变分模态分解(VMD)算法结合 VMD算法背景: VMD算法是一种自适应信号分解算法,主要用于分解信号为不同频率带宽的模态。 VMD的关键参数包括: 惩罚因子 α:控制带宽的限制。 分解层数 K:决定分解出的模态数。 QPSO算法背景: 量子粒子群优化(QPSO)是一种基于粒子群优化(PSO)的一种改进算法,通过量子行为模型增强全局搜索能力。 QPSO通过粒子的量子行为使其在搜索空间中不受位置限制,从而提高算法的收敛速度与全局优化能力。 任务: 使用QPSO优化VMD中的惩罚因子 α 和分解层数 K,以获得信号分解的最佳效果。 计划: 定义适应度函数:适应度函数根据VMD分解的效果来定义,通常使用重构信号的误差(例如均方误差、交叉熵等)来衡量分解的质量。 初始化QPSO粒子:定义粒子的位置和速度,表示 α 和 K 两个参数。初始化时需要在一个合理的范围内为每个粒子分配初始位置。 执行VMD分解:对每一组 α 和 K 参数,运行VMD算法分解信号。 更新QPSO粒子:使用QPSO算法更新粒子的状态,根据适应度函数调整粒子的搜索方向和位置。 迭代求解:重复QPSO的粒子更新步骤,直到满足终止条件(如适应度函数达到设定阈值,或最大迭代次数)。 输出优化结果:最终,QPSO算法会返回一个优化的 α 和 K,从而使VMD分解效果最佳。 2、将极光粒子(PLO)算法与变分模态分解(VMD)算法结合 PLO的优点与适用性 强大的全局搜索能力:PLO通过模拟极光粒子的运动,能够更高效地探索复杂的多峰优化问题,避免陷入局部最优。 鲁棒性强:PLO在面对高维、多模态问题时有较好的适应性,因此适合海上风电时间序列这种非线性、多噪声的数据。 应用场景:PLO适合用于优化VMD参数(α 和 K),并将其用于风电时间序列的预测任务。 进一步优化的建议 a. 实现更细致的PLO更新策略,优化极光粒子的运动模型。 b. 将PLO优化后的VMD应用于真实的海上风电数据,结合LSTM或XGBoost等模型进行风电功率预测。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值