3

カーソル内の動的フィールド名に問題があります。説明するのは少し難しいですが、試してみます...

3 つのテーブルがあります。

  1. T_IN: このテーブルについてはまだ何も知りません。構造もフィールド名も何もありません。

  2. T_OUT: これはターゲット テーブルです。

  3. T_KONF: このテーブルには 2 つの列があります。

    C_IN VarChar2: この列にはテーブル T_IN のフィールド名が含まれます

    C_OUT VarChar2: この列にはテーブル T_OUT のフィールド名が含まれます

テーブル T_KONF は、テーブル T_IN のどのフィールドのどのデータをテーブル T_OUT のどのフィールドに入れる必要があるかを教えてくれます。

今、私はレコードを持っています

MyRec C_OUT%ROWTYPE;

フィールド名を含む変数

field_name VarChar2(15) := 'PRODUCT';

レコードのこのフィールドに値を設定するにはどうすればよいですか? ハードコーディングすると、次のようになります。

MyRec.PRODUCT := value;

しかし、それを動的に行う方法はありますか?

MyRec.[field_name] := value; -- ???

それが十分に具体的だったことを願っています...ありがとう

4

1 に答える 1

1

レコード フィールドを動的に割り当てることはできません。

INDEX-BY PL/SQL テーブル (連想配列)を使用できますが、その型は事前にわかっている必要があります。すべてのメジャー タイプを含む動的 RECORD を使用でき、使用するフィールド (VARCHAR2、DATE...) を実行時に決定できますが、それはかなり面倒です。

代わりに、動的 SQL を使用することをお勧めします。実行時にすべての列名がわかっているため、列の型に互換性があると想定できるからです。

このようなものが動作するはずです (11gR2):

-- SETUP
-- CREATE TABLE T_KONF(C_IN VARCHAR2(30), C_OUT VARCHAR2(30));
-- INSERT INTO T_KONF VALUES ('C1', 'C2');
-- INSERT INTO T_KONF VALUES ('C2', 'C3');

SQL> DECLARE
  2     l_sql LONG;
  3  BEGIN
  4     SELECT 'INSERT INTO t_out (' ||
  5               listagg(dbms_assert.simple_sql_name('"'||t_konf.c_out||'"'),
  6                      ', ') WITHIN GROUP (ORDER BY t_konf.rowid)
  7            || ' )
  8             SELECT ' ||
  9               listagg(dbms_assert.simple_sql_name('"'||t_konf.c_in||'"'),
 10                       ', ') WITHIN GROUP (ORDER BY t_konf.rowid)
 11            || '
 12               FROM t_in
 13              WHERE 1 = 1' -- custom where clause
 14       INTO l_sql
 15       FROM t_konf;
 16     DBMS_OUTPUT.put_line(l_sql);
 17     -- EXECUTE IMMEDIATE (l_sql); -- uncomment when SQL is OK
 18  END;
 19  /

INSERT INTO t_out ("C3", "C2" )
           SELECT "C2", "C1"
             FROM t_in
            WHERE 1 = 1
于 2012-11-08T10:51:21.123 に答える