1

次のような手順があります。

PROCEDURE foo(
  p_field_name IN VARCHAR2,
  p_record IN table%rowtype )
IS
  v_value VARCHAR2(100);
BEGIN
  EXECUTE IMMEDIATE 'SELECT p_record.' || p_field_name || ' FROM dual' INTO v_value;
END

Oracleは無効な識別子であると不平を言いますp_record.my_field_name。これにより、即時実行が他のコンテキストで実行されていると思われます。

私が上でやろうとしていることをすることは可能ですか?

4

3 に答える 3

1

あなたがやろうとしていることは不可能だと思います。即時実行命令は、動的 SQL 実行です。「foo」プロシージャを作成するときはSQLステートメントは解析されませんが、実行時に解析されます。オラクルの場合は「select p_record」です。|| p_field_name || p_field_name || 'from dual' は varchar であり、p_record も同様です。したがって、これは、このエラーが発生する理由を説明しています。解決策は、if/elsif/... や case/when のように書くことです。

于 2009-08-18T14:57:14.057 に答える
1

EXECUTE IMMEDIATE で行うことは、どのコンテキストでも実行できる必要があります。あなたの例は、手順の外では実行できないため、これには適合しません。

考えられる回避策の 1 つ - 行全体ではなく ID を渡し、テーブルからその 1 つの列を選択します。ただし、頻繁に使用するとパフォーマンスが低下する可能性があります。

于 2009-08-17T20:55:28.913 に答える
1

IF/ELSIF の何が問題なのか

IF    p_field_name = 'COL1' THEN v_value := p_record.col1
ELSIF p_field_name = 'COL2' THEN v_value := p_record.col2
...
END IF;

ALL_TAB_COLUMNS からの SELECT からイベントを生成できます。きれいではないかもしれませんが、うまくいくでしょう。

于 2009-08-17T22:47:23.367 に答える