Пакетная выгрузка в Оракл

Способ пакетной выгрузки в таблицу Оракл через структуру XML.

Даный способ выгрузки разработан для заполнения таблиц оракл версии 11g. С помощью встроенного языка оракла достаточно просто перегнать передаваемые строки XML в таблицы. Пример в приложенной внешней обработке отправляет во внешнюю базу справочник номенклатуры, но он может быть легко модифицирован для любых табличных данных 1С. Для работы необходим настроенный доступ к серверу оракла.

Сначала в оракле необходимо создать таблицу для хранения наших данных. В нашем примере это STORAGE_TOVAR куда будем записывать код, наименование и артикул номенклатуры. 


CREATE TABLE "USER_1C"."STORAGE_TOVAR"
( "NOMENKLATURA_CODE" VARCHAR2(11 BYTE) NOT NULL ENABLE,
"ARTIKUL" VARCHAR2(50 BYTE),
"NOMENKLATURA_NAME" VARCHAR2(100 BYTE) NOT NULL ENABLE,
CONSTRAINT "STORAGE_TOVAR_PK" PRIMARY KEY ("NOMENKLATURA_CODE")
)

Временную таблицу где будем разворачивать XML.

  CREATE GLOBAL TEMPORARY TABLE "USER_1C"."TMP_TOVAR"
( "NOMENKLATURA_CODE" VARCHAR2(11 BYTE) NOT NULL ENABLE,
"ARTIKUL" VARCHAR2(50 BYTE),
"NOMENKLATURA_NAME" VARCHAR2(100 BYTE) NOT NULL ENABLE,
CONSTRAINT "TMP_TOVAR_PK" PRIMARY KEY ("NOMENKLATURA_CODE") ENABLE
) ON COMMIT DELETE ROWS ;

Далее в 1С формируем текст процедуры содержащей данные справочника.

 ТекстЗапроса = "declare
|    xml XMLType;
|    type arr_type is table of XMLType
|    index by binary_integer;
|    arr arr_type;
|    a binary_integer;
|begin
|
|" + ИтоговаяСтрока + "
|
|EXECUTE IMMEDIATE 'TRUNCATE TABLE tmp';
|
|a := arr.first;
|loop
|    INSERT INTO tmp_tovar SELECT * FROM
|    (WITH spisok_xml as(SELECT arr(a) xml from dual)
|    SELECT extractValue(value(t1), 'b/v1') nomenklatura_code,
|        extractValue(value(t1), 'b/v2') artikul,
|        extractValue(value(t1), 'b/v3') nomenklatura_name
|    FROM spisok_xml s, table(XMLSequence(s.xml.extract('a/b'))) t1);
|
|    exit when a = arr.last;
|    a := arr.next(a);
|end loop;
|
|MERGE INTO STORAGE_TOVAR D
|    USING (SELECT * FROM tmp_tovar) S
|    ON (D.nomenklatura_code = S.nomenklatura_code)
|WHEN MATCHED THEN
|    UPDATE SET D.artikul = S.artikul, D.nomenklatura_name = S.nomenklatura_name
|WHEN NOT MATCHED THEN
|    INSERT (D.nomenklatura_code, D.artikul, D.nomenklatura_name) VALUES (S.nomenklatura_code, S.artikul, S.nomenklatura_name);
|DELETE FROM STORAGE_TOVAR D
| WHERE NOT EXISTS (SELECT S.nomenklatura_code FROM tmp_tovar S WHERE D.nomenklatura_code = S.nomenklatura_code);
|
|COMMIT;
|
|end;";

Итоговая строка это массив данных в формате XML.

arr(1) := XMLType('<a><b><v1>ЦУ-00000053</v1><v2></v2><v3>Бутылка </v3></b><b><v1>ЦУ-00000054</v1><v2></v2><v3>Ящик </v3></b></a>');
arr(2) := XMLType('<a><b><v1>ЦУ-00000057</v1><v2>Л-90</v2><v3>Лимонад</v3></b><b><v1>ЦУ-00000058</v1><v2>Х-67891</v2><v3>Х-67891 1 Стинол 205 Завод бытовой техники</v3></b></a>');
arr(3) := XMLType('<a><b><v1>ЦУ-00000060</v1><v2></v2><v3>Пылесос Мобиль (Автомат) </v3></b><b><v1>ЦУ-00000061</v1><v2></v2><v3>Кофе-машина "Универсал"</v3></b></a>');

Отправляем процедуру на выполнение. Сначала информация загружается во временную таблицу, затем объединяется с основной таблицей.

Внешняя обработка тестировалась на конфигурации Управление небольшой фирмой (1.2.3.71) платформа 1С:Предприятие 8.3 (8.3.9.2309).

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *