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

したがって、これらの相関名は基本的にレコードです。レコードはKey-Valueストレージではないため、文字列キーで参照することはできません。

それらを使ってできることは次のとおりです。

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;
/

しかし、フィールドに動的にアクセスしたい場合、私が考えることができる1つの醜いことは、それが機能しているようです(これは最終的には動的ではありません...):各列に 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;

次に、必要に応じて値変数を使用します...

ただし、@ beherenow が指摘したように、注意してください

  • valueあなたの読書例の変数のデータ型は何ですか?
  • また、型の不一致が発生しないことをどのように確認できますか?

これらは、実装側からの決定を必要とする質問です。たとえば、斜視では、このことを使用して、同じ型を共有する列の値を動的に使用できます。

ただし、私が提案したそのような奇妙な仕掛けが使用される状況は見られず、これを使用することもサポートしていないことを強調しなければなりません。@beherenowの完全で決定的な回答の後、私がここに保管した理由は、このページを見つけたすべての人が見ることができるようにするためです-方法はあるかもしれませんが、使用すべきではありません...

私には、このことは次のように思えます:

  • 醜い
  • もろい
  • スケーリングが悪い
  • 恐ろしい
  • メンテナンスが難しい
  • ...そしてひどく醜い...

これが必要なユースケースを再考することを強くお勧めします。私自身、この種のコードを書いている誰かに怒って叫びます。これが絶対に唯一の方法であり、この方法で行われなければ宇宙全体が崩壊する場合を除きます... (これは非常にありそうもないことですが)

私があなたの質問を誤解していたらごめんなさい、それは私には完全に明確ではありませんでした

于 2013-03-07T12:29:04.197 に答える