0

如何从特殊:new:old“字符串键”中获取值?

例如在 PHP 中:

$key = 'bar';
$foo[$key]; //get foo value

如何在甲骨文?

:new.bar --get :new 'bar' value

key = 'bar';
:new[key] --How to?

可能吗?谢谢!

4

2 回答 2

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

于 2013-03-07T12:37:28.210 回答
0

据此_

第一种方法在语法上很好,它应该像这样使用:

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... 语句您希望能够动态使用...

这些方面的内容(更新 :new 记录):

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;

然后根据需要使用 value 变量...

但是要当心,正如@beherenow 指出的那样:

  • value您的阅读示例中变量的数据类型是什么?
  • 你怎么能确定你不会遇到类型不匹配?

这些问题需要执行方做出决定。例如,通过斜视,这个东西可以用来动态地使用来自共享相同类型的列的值。

不过我必须强调,我没有看到我提出的这种奇怪的装置会被使用的情况,我也不支持使用它。在@beherenow 给出完整而明确的答案之后,我将其保留在这里的原因是让每个找到此页面的人都可以看到 - 尽管可能有办法,但不应该使用它......

对我来说,这件事似乎:

  • 丑陋的
  • 严重缩放
  • 骇人听闻
  • 难以维护
  • ...aaand 可怕的丑陋...

我绝对建议重新考虑您需要它的用例。我自己会对写这种代码的人大喊大叫,除非这绝对是唯一的方法,如果不这样做,整个宇宙就会崩溃......(虽然这不太可能)

抱歉,如果我误解了您的问题,我并不完全清楚

于 2013-03-07T12:29:04.197 回答