Oracle PL / SQL变量记录字段名称

时间:2012-11-08 10:19:50

标签: oracle variables plsql record

我在游标中遇到动态字段名称的问题。这有点难以解释,但我会尝试......

共有3个表格:

  
      
  1. T_IN:我对这张桌子一无所知。没有结构,没有字段名称,根本没有。

  2.   
  3. T_OUT:这是目标表

  4.   
  5. T_KONF:此表有2列:

         

    C_IN VarChar2:此列包含表T_IN

    的字段名称      

    C_OUT VarChar2:此列包含表T_OUT的字段名称

  6.   

表T_KONF告诉我,来自表T_IN的wich字段的数据必须在表T_OUT的哪个字段中进行。

现在我有一个记录

MyRec C_OUT%ROWTYPE;

以及包含fieldname的变量

field_name VarChar2(15) := 'PRODUCT';

如何将记录的此字段设置为值?硬编码看起来像这样:

MyRec.PRODUCT := value;

但有没有办法动态地做到这一点?

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

我希望这足够具体......谢谢

1 个答案:

答案 0 :(得分:1)

您无法动态分配记录字段。

您可以使用INDEX-BY PL/SQL Table (associative array),但必须事先知道其类型。您可以使用包含所有主要类型的动态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