Oracle PL/SQL Variable Record Field Names Oracle PL/SQL Variable Record Field Names oracle oracle

Oracle PL/SQL Variable Record Field Names


You can't assign a record field dynamically.

You could use an INDEX-BY PL/SQL Table (associative array) but its type has to be known in advance. You could use a dynamic RECORD containing all majors types and you could decide at run-time which field to use (VARCHAR2, DATE...) but that would be rather tedious.

Instead I suggest you use dynamic SQL since you know at run-time all column names and we can suppose that the column types are compatible.

Something like this should work (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