2015-02-12 2 views
0

У меня проблема, и я не знаю, как это сделать.PL/SQL динамически назначает поля

Я использую базу данных Oracle 10g для импорта пяти типов файлов. Эти файлы находятся в формате CSV. Я знаю, что в файле 1 имя поля находится в 1-й позиции, во втором файле я знаю, что имя поля находится в 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 

может быть, я вижу это неправильный путь ... но я верю, можно сделать это в одной процедуре.

Может кто-нибудь помочь?

ответ

1

Вы можете рассмотреть возможность преобразования исходной таблицы в 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 

Есть несколько способов преобразования оператора выбора в XML - XMLType (курсор (...)), dbms_xmlquery, и т. д.

Вы можете даже обновить таблицу dest с помощью dbms_xmlsave и dbms_xmlstore вместо инструкции insert или update.

0

Вы можете создать представление для каждого файла импорта, например.

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. 

Тогда вам не нужно перемещаться вокруг ваших колонок.

Смежные вопросы