【问题标题】:PL/SQL dynamically assign fieldsPL/SQL 动态分配字段
【发布时间】:2015-04-13 09:05:32
【问题描述】:

我有一个问题要解决,但我不知道该怎么做。

我正在使用 Oracle 10g 数据库导入五种类型的文件。此文件为 CSV 格式。 我知道在文件 1 中,字段名称位于第 1 位,在第 2 个文件中,我知道字段名称位于第 4 位……依此类推。基本上相同的字段在所有文件中,但在不同的位置。 我将文件导入数据库中的一个表(我们称之为 x_table),其中包含 ipl_c1、ipl_c2、ipl_c3 等字段......

我在每个文件的数据库表中的字段位置信息中得到了这个(我们称之为 x_param_table)。 现在我必须将这些数据迁移到不同的表中(每种文件类型一个表)。 我的问题是:我必须制定一个程序来处理每个文件?这可以动态进行吗?

我正在做的是,我根据这样的命运表创建一个类型:

i_table destiny_table%rowtype; 
i_source_table x_table%rowtype;

接下来我迭代记录所在的表 (i_source_table),但每个文件的过程不同。

如果我在文件 1 中,那么我

i_table(i).name := i_source_table(idx).ipl_c1

如果我在文件 2 中,那么我

i_table(i).name := i_source_table(idx).ipl_c4

因为我得到了数据库(x_param_table)中字段的位置,所以不能做类似的事情

i_table(i).name := i_source_table(idx).ipl_c||x_param_table.position

也许我看错了……但我相信可以在一个过程中做到这一点。

有人可以帮忙吗?

【问题讨论】:

    标签: oracle plsql oracle10g plsqldeveloper


    【解决方案1】:

    您可以为每个导入文件创建一个视图,例如

    create or replace view file_1 as
    select ipl_c1, ipl_c3, ipl_c2, ipl_c5, ipl_c4
    from x_table;
    
    create or replace view file_2 as
    select ipl_c5, ipl_c2, ipl_c1, ipl_c3, ipl_c4
    from x_table;
    
    create or replace view file_3 as
    select ipl_c3, ipl_c1, ipl_c2, ipl_c4, ipl_c5
    from x_table;
    
    etc.
    

    然后您可以对这些视图进行简单的插入。每个文件都使用关联的视图:

    For file type #1
    insert into file_1 values (col_1, col_2, col_3, col_4 ,col_5);
    
    For file type #2
    insert into file_2 values (col_1, col_2, col_3, col_4 ,col_5);
    
    etc.
    

    那么你就不必在你的列中移动。

    【讨论】:

      【解决方案2】:

      您可以考虑将源表转换为 XMLTYPE,以便您能够动态获取特定列的值。这样,您只需要定义很少的程序即可完成需求。

      例如:

      DECLARE
          SRC XMLTYPE;
      BEGIN
          SRC := dbms_xmlgen.getxmltype('SELECT * FROM ALL_OBJECTS WHERE ROWNUM < 5');
          FOR R IN (SELECT COLUMN_VALUE
                      FROM TABLE(XMLSEQUENCE(EXTRACT(SRC, '/ROWSET/ROW')))) LOOP
              DBMS_OUTPUT.PUT_LINE('Objet name: ' || R.COLUMN_VALUE.EXTRACT('/ROW/OBJECT_NAME/text()')
                                   .GETSTRINGVAL);
              DBMS_OUTPUT.PUT_LINE('The fifth column value is: ' || R.COLUMN_VALUE.EXTRACT('/ROW/*[5]/text()')
                                   .GETSTRINGVAL);
          END LOOP;
      END;
      

      输出是:

      Objet name: ICOL$
      The fifth column value is: TABLE
      Objet name: TAB$
      The fifth column value is: TABLE
      Objet name: I_USER2
      The fifth column value is: INDEX
      Objet name: I_CCOL2
      The fifth column value is: INDEX
      

      有几种方法可以将select语句转换为xml——xmltype(cursor(...))、dbms_xmlquery等

      您甚至可以使用 dbms_xmlsave 和 dbms_xmlstore 来更新 dest 表,而不是使用 insert 或 update 语句。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-29
        相关资源
        最近更新 更多