如何通过“字符串键”从特殊:new
或:old
获取值?
e.g。用PHP:
$key = 'bar';
$foo[$key]; //get foo value
如何在Oracle中使用?
:new.bar --get :new 'bar' value
和
key = 'bar';
:new[key] --How to?
有可能吗? THX!
答案 0 :(得分:2)
这是不可能的。
在行级别触发的触发器可以访问行中的数据 它是通过使用相关名进行处理的。默认相关性 名称是OLD,NEW和PARENT。
...
OLD,NEW和PARENT也是 称为伪记录,因为它们有记录结构,但是 允许在比记录更少的上下文中。一个结构 伪记录是table_name%ROWTYPE,其中table_name是其名称 创建触发器的表(对于OLD和NEW)或者 父表的名称(对于PARENT)。
http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/triggers.htm#autoId4
因此,这些相关名称基本上都是记录。记录不是键值存储,因此您无法通过字符串键引用它。
以下是你可以用它们做的事情:
http://docs.oracle.com/cd/E11882_01/appdev.112/e10472/composites.htm#CIHFCFCJ
答案 1 :(得分:0)
根据this
第一种方法在语法上是好的,它应该像这样使用:
create trigger trg_before_insert before insert on trigger_tbl
for each row
begin
insert into trigger_log (txt) values ('[I] :old.a=' || :old.a || ', :new.a='||:new.a);
end;
/
但是如果你想动态地访问这个领域,我可以想到一个丑陋的东西,这似乎是有效的(最终根本不是动态的......):使用CASE WHEN ...语句对于您希望能够动态使用的每一列......
这些内容(更新:新记录):
key='bar';
value = 'newValue';
CASE key
WHEN 'bar' THEN :new.bar = value;
WHEN 'foo' THEN :new.foo = value;
WHEN 'baz' THEN :new.baz = value;
END;
从“动态列”中读取值:
key='bar';
value = CASE key
WHEN 'bar' THEN :new.bar;
WHEN 'foo' THEN :new.foo;
WHEN 'baz' THEN :new.baz;
END;
然后根据需要使用值变量...
小心但是,正如@beherenow所说:
- 阅读示例中
value
变量的数据类型是什么?- 你怎么能确定你不会遇到类型不匹配?
这些问题需要执行方的决定。例如,对于斜视,此事可用于动态使用共享相同类型的列中的值。
我必须强调的是,我没有看到我建议使用这种奇怪的装置的情况,我也不支持使用它。在@ beherenow的完整和确定的答案之后,我保留它的原因是每个人都能看到这个页面 - 虽然可能有办法,但不应该使用...
对我来说,这件事似乎:
我绝对建议您重新考虑您需要的用例。我自己会愤怒地对写这种代码的人大喊大叫,除非这绝对是唯一的方式,整个宇宙都崩溃了,如果不是这样做的话......(尽管这很不可能)
对不起,如果我误解了你的问题,那对我来说并不完全清楚