首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何使用:NEW或:OLD运算符获取oracle触发器中的所有新值。like (:NEW.*)

如何使用:NEW或:OLD运算符获取oracle触发器中的所有新值。like (:NEW.*)
EN

Stack Overflow用户
提问于 2019-05-20 14:40:29
回答 1查看 774关注 0票数 0

在将触发器插入到另一个表之前,我正在尝试获取触发器中的所有新值和旧值,但我只能获取特定值,而不是所有数据。

我尝试过:NEW.*和:OLD.*它适用于postgress,但不适用于oracle。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE OR REPLACE TRIGGER trg_customer_tbl_ib01
BEFORE INSERT OR UPDATE OR DELETE ON TEST.customer_test
FOR EACH ROW
DECLARE
vAction VARCHAR2(4000) := null;
vFound INT := null;
vREC TEST.CUSTOMER_TEST%ROWTYPE;
BEGIN
IF INSERTING OR UPDATING THEN
select :NEW.* into vREC FROM DUAL;
ELSIF DELETING THEN
select :OLD.* into vREC FROM DUAL;
END IF;
IF DELETING THEN
INSERT INTO TEST.CUSTOMER_TEST_AUDIT SELECT 
CUSTOMER_TEST_AUDIT_id_seq.NEXTVAL,'D',SYSDATE, vREC.* FROM  DUAL;
ELSIF UPDATING THEN
INSERT INTO TEST.CUSTOMER_TEST_AUDIT SELECT 
CUSTOMER_TEST_AUDIT_id_seq.NEXTVAL,'U',SYSDATE, vREC.*FROM  DUAL;
ELSIF INSERTING THEN
INSERT INTO TEST.CUSTOMER_TEST_AUDIT SELECT 
CUSTOMER_TEST_AUDIT_id_seq.NEXTVAL,'I',SYSDATE, vREC.* FROM  DUAL;
END IF;
END;

我收到错误: Error(10,8):PLS-00049:错误的绑定变量'NEW.‘’

EN

回答 1

Stack Overflow用户

发布于 2019-05-20 19:45:20

好吧,别着急。不要使用快捷方式。

测试用例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SQL> create table test as select * From dept;

Table created.

SQL> create table test_log as select * From dept where 1 = 2;

Table created.

SQL> alter table test_log add (id number, action varchar2(1), datum date);

Table altered.

SQL> create sequence seqlog;

Sequence created.

SQL>

触发器。单独引用每一列。:NEW.*在Postgres中工作的事实并不意味着它在Oracle中也能工作。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SQL> create or replace trigger trg_test
  2    before insert or update or delete on test
  3    for each row
  4  begin
  5    if updating then
  6       insert into test_log (deptno, dname, loc, id, action, datum)
  7         values
  8         (:old.deptno, :old.dname, :old.loc, seqlog.nextval, 'U', sysdate);
  9       insert into test_log (deptno, dname, loc, id, action, datum)
 10         values
 11         (:new.deptno, :new.dname, :new.loc, seqlog.nextval, 'U', sysdate);
 12    elsif inserting then
 13       insert into test_log (deptno, dname, loc, id, action, datum)
 14         values
 15         (:new.deptno, :new.dname, :new.loc, seqlog.nextval, 'I', sysdate);
 16    elsif deleting then
 17       insert into test_log (deptno, dname, loc, id, action, datum)
 18         values
 19         (:old.deptno, :old.dname, :old.loc, seqlog.nextval, 'D', sysdate);
 20    end if;
 21  end;
 22  /

Trigger created.

SQL>

测试:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SQL> alter session set nls_Date_format = 'dd.mm.yyyy hh24:mi:ss';

Session altered.

SQL> update test set loc = 'Croatia' where deptno = 10;

1 row updated.

SQL> delete from test where deptno = 20;

1 row deleted.

SQL> insert into test (deptno, dname, loc) values (99, 'IT', 'Zagreb');

1 row created.

SQL> select * From test_log order by id;

    DEPTNO DNAME          LOC                   ID A DATUM
---------- -------------- ------------- ---------- - -------------------
        10 ACCOUNTING     NEW YORK               5 U 20.05.2019 21:44:33
        10 ACCOUNTING     Croatia                6 U 20.05.2019 21:44:33
        20 RESEARCH       DALLAS                 7 D 20.05.2019 21:44:43
        99 IT             Zagreb                 8 I 20.05.2019 21:44:52

SQL>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56223237

复制
相关文章
关于MySQL触发器new和old
下面为您介绍MySQL触发器new old的相关知识,供您参考学习,如果您在MySQL触发器方面遇到过类似的问题,不妨一看,相信对您会有所帮助。
星哥玩云
2022/08/17
6310
触发器学习笔记(:new,:old用法)
转载自:https://www.2cto.com/database/201301/186334.html
qubianzhong
2019/06/26
9640
Oracle 触发器中修改字段值
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wzy0623/article/details/53909715
用户1148526
2019/05/25
1.8K0
pt-online-schema-change 添加字段过程解析
对于大表的 DDL操作,我们一般使用 pt-online-schema-change  来进行。
保持热爱奔赴山海
2019/09/18
1.2K0
Oracle实现like多个值的查询
某天客户有一个需求,给定一批的手机号码或者电话号码,查询出相关的通话记录,以及相关的一些信息。
星哥玩云
2022/08/16
2.8K0
Oracle实现like多个值的查询
oracle怎么使用触发器,Oracle触发器的使用[通俗易懂]
触发器是指存放在数据库中,并被隐藏执行的存储过程。在Oracle8i之前,只允许基于表或视图的DML操作(insert,update,delete)建立触发器,在oracle8i之后,不仅支持DML操作,也允许基于系统事件(启动数据库,关闭数据库,登录)和DDL操作建立触发器。
全栈程序员站长
2022/09/14
2.4K0
单表超 100000000 条记录的数据库结构变更,你能做到在线平滑变更吗?
Percona-Toolkit 源自 Maatkit 和 Aspersa 工具,这两个工具是管理 MySQL 的最有名的工具,但 Maatkit 已经不维护了,全部归并到 Percona-Toolkit。Percona Toolkit 是一组高级的命令行工具,用来管理 MySQL 和系统任务,主要包括以下功能:
iMike
2019/10/14
3.4K0
MySQL触发器了解一下
触发器是与表有关的数据库对象,当表发生INSERT/UPDATE/DELETE操作时,对应操作的触发器会被触发,将在这些操作之前或之后执行触发器中定义的SQL语句集合。
布禾
2021/04/15
7720
mysql触发器
近期遇到需要写触发器的需求,需要将A表中数据修改的信息,添加到B表中,之前比较少写,记录一下学习到的一些知识点
在水一方
2022/09/16
6.8K0
mysql触发器
ORACLE触发器(trigger)的使用
触发器是一种在事件发生时隐式地自动执行的PL/SQL块,不能接受参数,不能被显式调用
全栈程序员站长
2022/09/13
1.1K0
ORACLE触发器(trigger)的使用
Oracle触发器详细讲解
CREATE OR REPLACE TRIGGER scott_trigger BEFORE DDL ON SCHEMA BEGIN   RAISE_APPLICATION_ERROR(-20008,'禁止scott用户的所有ddl操作'); END;create sequence myseq;
星哥玩云
2022/08/17
9730
Oracle触发器详细讲解
数据库记录安全解决方案
目录 1. 什么是防删除,防撰改 2. 为什么要做防删除,防撰改限制 3. 何时做防删除,防撰改限制 4. 在哪里做防删除,防撰改限制 5. 谁去做防删除,防撰改限制 6. 怎样实现防删除,防撰改限制 6.1. 限制删除 6.2. 限制修改 6.3. 为数据安全而分库 7. 怎样实现数据修改留痕 7.1. 版本控制 7.2. 一张表实现历史日志记录 1. 什么是防删除,防撰改 禁止数据删除,数据一旦增加不允许数据被任何人删除 禁止数据修改,数据一旦建立不允许对数据做修改操作 2. 为什么要做防删除,防撰改限
netkiller old
2018/03/05
1.2K0
在C或C++中如何使用PI(π)值
参考链接: C++ acos() #include <math.h> #define PI acos(-1) 主要是利用利用数学函数中的反三角函数,但是要注意一定引入math包           arccos          ⁡          (          −          1          )          =          π         \arccos(-1)=\pi      arccos(−1)=π  完整示例:  //#define LOCAL #includ
用户7886150
2021/02/09
5.9K0
MySQL触发器详解
它是一种特殊的一种存储过程,当表数据发生了新增、更新、删除时,便触发这个存储过程。
半月无霜
2023/03/03
6.2K0
MySQL触发器详解
数据库记录安全解决方案
数据库记录安全解决方案 http://netkiller.github.io/journal/mysql.security.html 摘要 数据库记录防删除,放撰改,撰改留痕,灵活性解决方案 2014-08-28 第二版 ---- 目录 1. 什么是防删除,防撰改 2. 为什么要做防删除,防撰改限制 3. 何时做防删除,防撰改限制 4. 在哪里做防删除,防撰改限制 5. 谁去做防删除,防撰改限制 6. 怎样实现防删除,防撰改限制 6.1. 限制删除 6.2. 限制修改 6.3. 为数据安全而分库 7. 怎样
netkiller old
2018/03/05
1.3K0
使用 Metasploit 获取哈希或域内哈希值
大家好,这里是 渗透攻击红队 的第 35 篇文章,本公众号会记录一些我学习红队攻击的复现笔记(由浅到深),不出意外每天一更
渗透攻击红队
2020/12/14
1.8K0
PL/SQL学习笔记-触发器
一:语句级触发器 语句级触发器是指当执行DML操作时,以语句为单位执行的触发器 (注意与下面提到的行级触发器比较) 先看代码
liulun
2022/05/09
1610
PL/SQL学习笔记-触发器
_itemFailedToPlayToEnd: { kind = 1; new = 2; old = 0; }
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/115859.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/08
1770
_itemFailedToPlayToEnd: { kind = 1; new = 2; old = 0; }
如何使用 C 或 C++ 获取目录中的文件列表
如何使用 C 或 C++ 获取目录中的文件列表?我的程序不允许使用 ls 这样的命令。
ClearSeve
2022/02/10
7.9K0
postgresql 触发器 简介(转)
– 把before for each row的触发器删掉, 再测试插入 : postgres=# drop trigger tg02 on t_ret; DROP TRIGGER postgres=# drop trigger tg2 on t_ret; DROP TRIGGER postgres=# insert into t_ret values(1,’digoal’,now()); NOTICE: 00000: tg01 LOCATION: exec_stmt_raise, pl_exec.c:2840 NOTICE: 00000: tg1 LOCATION: exec_stmt_raise, pl_exec.c:2840 NOTICE: 00000: tg03, after for each row 的触发器函数返回空, 不影响后续的触发器是否被调用. 因为只要表上面发生了真正的行操作, after for each row就会被触发, 除非when条件不满足. (这个后面会讲到) LOCATION: exec_stmt_raise, pl_exec.c:2840 NOTICE: 00000: tg3 LOCATION: exec_stmt_raise, pl_exec.c:2840 NOTICE: 00000: tg04 LOCATION: exec_stmt_raise, pl_exec.c:2840 NOTICE: 00000: tg4 LOCATION: exec_stmt_raise, pl_exec.c:2840 INSERT 0 1 – 有数据插入. 这也说明了before for each statement的返回值为空并不会影响数据库对行的操作. 只有before for each row的返回值会影响数据库对行的操作. postgres=# select * from t_ret ; id | info | crt_time —-+——–+—————————- 1 | digoal | 2013-03-10 16:50:39.551481 (1 row)
qubianzhong
2019/07/01
4K0

相似问题

:new和:old值在oracle触发器中动态

150

动态评估Oracle触发器中的伪记录(:OLD,:NEW)

13

Oracle触发器在更新和插入之前使用:new和:old

12

PL/pgSQL:如何使用IF NEW.<variable_column_name> <> OLD.<variable_column_name>

10

用“New”和“Old”值依赖项重构Oracle触发器中的子子句

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文