Oracle通过字符串键从以下方式获取值:new,:old

时间:2013-03-07 12:24:42

标签: oracle plsql

如何通过“字符串键”从特殊: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!

2 个答案:

答案 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的完整和确定的答案之后,我保留它的原因是每个人都能看到这个页面 - 虽然可能有办法,但不应该使用...

对我来说,这件事似乎:

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

我绝对建议您重新考虑您需要的用例。我自己会愤怒地对写这种代码的人大喊大叫,除非这绝对是唯一的方式,整个宇宙都崩溃了,如果不是这样做的话......(尽管这很不可能)

对不起,如果我误解了你的问题,那对我来说并不完全清楚