Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Импорт данных из 1С в Oracle / 6 сообщений из 6, страница 1 из 1
15.02.2022, 18:08
    #40134321
verter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт данных из 1С в Oracle
Возникла необходимость в передаче данных из 1С в базу Oracle.

В 1С через ODBC было настроено соединение. С помощью ADODB можно выполнять PL-SQL выражения или просто DML-команды INSERT в оракловскую базу.

Проблема в том, что нужно передать много - миллионы записей.

Чтобы передать, нужно выполнить PL-SQL выражение, но перед этим его нужно сформировать.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
BEGIN
  EXECUTE IMMEDIATE 'ALTER SESSION ENABLE PARALLEL DML';

  INSERT /*+ APPEND PARALLEL(16) */
  INTO (поле1, поле2, …)
  SELECT значение1, значение2, … FROM DUAL UNION
  SELECT значение1, значение2, … FROM DUAL UNION
  …

  COMMIT;

  EXECUTE IMMEDIATE 'ALTER SESSION DISABLE PARALLEL DML';
END;


В 1С средствами его языка надо формировать этот текст запроса. Взяв каким то образом из базы 1С значения нужно формировать миллион "SELECT значение1, значение2, … FROM DUAL". Но что то мне подсказывает, что это плохо.

Как бы это лучше сделать?
Ведь тут не сделать SELECT к какой то таблице оракла, потому что данные берутся из 1С.
...
Рейтинг: 0 / 0
15.02.2022, 18:18
    #40134324
dmdmdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт данных из 1С в Oracle
verter

Как бы это лучше сделать?


Много способов.

- select from 1c_tables со стороны оракла;
- insert into oracle_tables со стороны 1С (точнее, MSSQL);
- файловая передача, в т.ч. миллионы insert - замерьте скорость.

Поскольку связи между 1С-объектами и таблицами БД может установить только движок 1С, единственный правильный способ - воспользоваться им и сделать сервис обмена данными.

Пример:

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
"object": {
		"inf_doc_selling": [
			{
				"ID_HEAD": "e1c1817e-896f-11ec-8748-ac1f6b3e3ec3",
				"ID_TYPEDOC": "Реализация товаров и услуг",
				"ID_CLIENT": "2322259f-9508-11e1-9f00-00155d001304",
				"ID_CLIENT2": "00000000-0000-0000-0000-000000000000",
				"ID_DEP": "d1644c8e-f9ec-11eb-8c45-a8a159650ac5",
				"NUM_HEAD": "0М00-000767",
				"DATE_HEAD": "08.02.2022 23:59:59",
				"CLOSED": 0,
				"PARENT_ID_HEAD": "a5117225-88a6-11ec-8748-ac1f6b3e3ec3",
				"INVOICE_NUM": "",
				"INVOICE_DATA": "",
				"ORG_INN": "5257081321",
				"GOODS": [
					{
						"ID_WARE": "7a766223-476d-11ec-a6bd-3cd92beecda8",
						"LINENO": 1,
						"QUANTITY": 1,
						"PRICE1": 3285,
						"PRICEDISCOUNT": 3285,
						"NDS": 0
					},
					{
						"ID_WARE": "6e75b81c-0308-11eb-bcb5-3cd92beecda8",
						"LINENO": 2,
						"QUANTITY": 2,
						"PRICE1": 4085,
						"PRICEDISCOUNT": 4085,
						"NDS": 0
					},
					{
						"ID_WARE": "49bca688-d927-11e9-9fd3-3cd92beecda8",
						"LINENO": 3,
						"QUANTITY": 3,
						"PRICE1": 4355,
						"PRICEDISCOUNT": 4355,
						"NDS": 0
					},
					{
						"ID_WARE": "5361b08b-3876-11ec-bb01-3cd92beecda8",
						"LINENO": 4,
						"QUANTITY": 1,
						"PRICE1": 4955,
						"PRICEDISCOUNT": 4955,
						"NDS": 0
					},
					{
						"ID_WARE": "d85ac23c-1a79-11ea-a7dc-3cd92beecda8",
						"LINENO": 5,
						"QUANTITY": 1,
						"PRICE1": 4715,
						"PRICEDISCOUNT": 4715,
						"NDS": 0
					}
				]
			},
			{
				"ID_HEAD": "9af6d5c9-8971-11ec-8748-ac1f6b3e3ec3",
				"ID_TYPEDOC": "Реализация товаров и услуг",
				"ID_CLIENT": "2322259f-9508-11e1-9f00-00155d001304",
				"ID_CLIENT2": "00000000-0000-0000-0000-000000000000",
				"ID_DEP": "8255cef2-f9ec-11eb-8c45-a8a159650ac5",
				"NUM_HEAD": "0Н00-007364",
				"DATE_HEAD": "08.02.2022 23:59:59",
				"CLOSED": 0,
				"PARENT_ID_HEAD": "cbc3f761-88a6-11ec-8748-ac1f6b3e3ec3",
				"INVOICE_NUM": "0Н00-0007859",
				"INVOICE_DATA": "08.02.2022 23:59:59",
				"ORG_INN": "5253000410",
				"GOODS": [
					{
						"ID_WARE": "70c85a08-06ed-11e2-a350-00155d001304",
						"LINENO": 1,
						"QUANTITY": 1,
						"PRICE1": 4685,
						"PRICEDISCOUNT": 4685,
						"NDS": 20
					},
					{
						"ID_WARE": "911e86e8-9afe-11e8-9d7f-3cd92beecda8",
						"LINENO": 2,
						"QUANTITY": 2,
						"PRICE1": 4555,
						"PRICEDISCOUNT": 3871.75,
						"NDS": 20
					},
					{
						"ID_WARE": "84d3db18-555c-11eb-a122-3cd92beecda8",
						"LINENO": 3,
						"QUANTITY": 1,
						"PRICE1": 1535,
						"PRICEDISCOUNT": 1304.75,
						"NDS": 20
					},
					{
						"ID_WARE": "5902219d-555e-11eb-a122-3cd92beecda8",
						"LINENO": 4,
						"QUANTITY": 1,
						"PRICE1": 1475,
						"PRICEDISCOUNT": 1253.75,
						"NDS": 20
					},
					{
						"ID_WARE": "22741527-ca55-11ea-bb55-3cd92beecda8",
						"LINENO": 5,
						"QUANTITY": 1,
						"PRICE1": 2425,
						"PRICEDISCOUNT": 2061.25,
						"NDS": 20
					},
					{
						"ID_WARE": "fe6a367c-9861-11eb-bd70-3cd92beecda8",
						"LINENO": 6,
						"QUANTITY": 1,
						"PRICE1": 1725,
						"PRICEDISCOUNT": 1466.25,
						"NDS": 20
					},
					{
						"ID_WARE": "6a3e53f2-6227-11eb-88be-3cd92beecda8",
						"LINENO": 7,
						"QUANTITY": 1,
						"PRICE1": 965,
						"PRICEDISCOUNT": 820.25,
						"NDS": 20
					},
					{
						"ID_WARE": "26f8ce0b-6228-11eb-88be-3cd92beecda8",
						"LINENO": 8,
						"QUANTITY": 1,
						"PRICE1": 1485,
						"PRICEDISCOUNT": 1262.25,
						"NDS": 20
					},
					{
						"ID_WARE": "d4c02164-6229-11eb-88be-3cd92beecda8",
						"LINENO": 9,
						"QUANTITY": 1,
						"PRICE1": 1675,
						"PRICEDISCOUNT": 1423.75,
						"NDS": 20
					},
					{
						"ID_WARE": "4803bc05-fc89-11e5-918a-3cd92beecda8",
						"LINENO": 10,
						"QUANTITY": 1,
						"PRICE1": 4125,
						"PRICEDISCOUNT": 4125,
						"NDS": 20
					},
					{
						"ID_WARE": "0c4948d3-761a-11e8-834c-3cd92beecda8",
						"LINENO": 11,
						"QUANTITY": 1,
						"PRICE1": 1735,
						"PRICEDISCOUNT": 1735,
						"NDS": 20
					},
					{
						"ID_WARE": "b96f561d-c7a3-11e8-8034-3cd92beecda8",
						"LINENO": 12,
						"QUANTITY": 1,
						"PRICE1": 3195,
						"PRICEDISCOUNT": 3195,
						"NDS": 20
					},
					{
						"ID_WARE": "5b1f9da3-1599-11e9-b4fa-3cd92beecda8",
						"LINENO": 13,
						"QUANTITY": 2,
						"PRICE1": 3795,
						"PRICEDISCOUNT": 3795,
						"NDS": 20
					},
					{
						"ID_WARE": "10f7452c-4a77-11e6-be43-3cd92beecda8",
						"LINENO": 14,
						"QUANTITY": 1,
						"PRICE1": 1315,
						"PRICEDISCOUNT": 1117.75,
						"NDS": 20
					},
					{
						"ID_WARE": "7c44233a-f3a4-11e8-aa78-3cd92beecda8",
						"LINENO": 15,
						"QUANTITY": 1,
						"PRICE1": 11255,
						"PRICEDISCOUNT": 11255,
						"NDS": 20
					},
					{
						"ID_WARE": "0df01df1-64df-11e9-a2e9-3cd92beecda8",
						"LINENO": 16,
						"QUANTITY": 2,
						"PRICE1": 4895,
						"PRICEDISCOUNT": 4160.75,
						"NDS": 20
					}
				]
			},




Ведь тут не сделать SELECT к какой то таблице оракла, потому что данные берутся из 1С.

Любые селекты Oracle-MSSQL, MSSQL-Oracle можно сделать, вопрос в желании.
...
Рейтинг: 0 / 0
15.02.2022, 18:24
    #40134327
SQL*Plus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт данных из 1С в Oracle
verter,

Выполните выгрузку таблиц 1С в текстовые файлы
и затем загружайте из этих файлов данные в базу Oracle,
используя стандартную утилиту SQL*Loader.

Другой вариант - настроить Oracle® Database Gateway for ODBC
...
Рейтинг: 0 / 0
16.02.2022, 00:10
    #40134408
verter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт данных из 1С в Oracle
Может быть вообще обойтись без обработок в 1С и без использования ADODB в них.
Допустим 1С специалист хорошо знает структуру MSSQL базы, тогда подключив через ODBC Оракл к MSSQL можно было бы с сервера MSSQL скриптом lделать запрос к MSSQL базе, а резалт-сет вставлять в оракловскую базу.

В Оракле есть гетерогенный сервис благодаря которому можно в одном и том же запросе обращаться как к таблицам оракла так и к таблицам MSSQL, с которым связь настроена через ODBC.
Но вот не знаю есть ли подобный сервис у MSSQL чтобы сделать наоборот - из MSSQL обращаться одновременно и к MSSQL таблицам и оракловым?
...
Рейтинг: 0 / 0
16.02.2022, 09:18
    #40134439
Vadim Lejnin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт данных из 1С в Oracle
...
Рейтинг: 0 / 0
16.02.2022, 12:25
    #40134489
dmdmdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт данных из 1С в Oracle
Допустим 1С специалист хорошо знает структуру MSSQL базы, тогда подключив через ODBC Оракл к MSSQL можно было бы с сервера MSSQL скриптом lделать запрос к MSSQL базе, а резалт-сет вставлять в оракловскую базу.

Так действовать можно, но код будет трудночитаемый.
Пример:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
  merge into department_1c d
  using (
          select dep."_IDRRef" ID_DEPARTMENT, dep."_Code" CODE, dep."_Description" NAME_DEP
            from "dbo"."_Reference218"@DB1C dep
        ) new_d on (d.id_department = new_d.id_department)
        
  when matched then update 
                set d.name_dep = new_d.name_dep,
                    d.code = new_d.code
                
  when not matched then insert (d.id_department, d.name_dep, d.code)
                        values (new_d.id_department, new_d.name_dep, new_d.code)
     where (new_d.name_dep != 'Склады');
     

  merge into client_1c c
  using (
         select client."_IDRRef" ID_CLIENT, client."_Code" CODE, client."_Description" NAME_CLIENT
           from dbo."_Reference123"@DB1C client
          where client."_ParentIDRRef" in
                ( '9F0000155D00130411E195027661F3FC',
                  '9F0000155D00130411E195027661F3FB' 
                )
        ) new_c on (c.id_client = new_c.id_client)
  when matched then update 
                set c.code = new_c.code,
                    c.name_client = new_c.name_client
                
  when not matched then insert (c.id_client, c.code, c.name_client)
                        values (new_c.id_client, new_c.code, new_c.name_client);
  -- Реализация
  merge into head_1c h
  using (
          select head."_IDRRef" ID_HEAD, head."_Fld14825RRef" ID_DEPARTMENT, head."_Fld14814RRef" ID_CLIENT, head."_Fld14810RRef" ID_CLIENT2,
                 head."_Number" NUM_HEAD, head."_Date_Time" - 730485 DATE1,
                 head."_Marked" marked,
                 1 doctype
            from "dbo"."_Document540"@DB1C head
           where trunc(head."_Date_Time" - 730485) >= trunc(sysdate - 7)
             and head."_Fld14814RRef" in (select id_client from client_1c)
             and head."_Marked" !='01' -- кроме удаленных
             and head."_Posted" = '01' -- только проведенные
         ) new_h on (h.id_head = new_h.id_head)
  when matched then update 
                set id_department = new_h.id_department,
                    id_client = new_h.id_client,
                    id_client2 = new_h.id_client2,
                    num_head = new_h.num_head,
                    date1 = new_h.date1,
                    marked = new_h.marked
     
  when not matched then insert (id_head, id_department, id_client, num_head, date1, marked, id_client2, doctype)
                        values(new_h.id_head, new_h.id_department, new_h.id_client, new_h.num_head, new_h.date1, new_h.marked, new_h.id_client2, new_h.doctype);


Кроме того, при переезде, при апгрейде и еще каких-то действиях эти динамически генерируемые поля могут поменяться, и придется это тоже отрабатывать.
Я попробовал данный подход и отказался от него в пользу передачи данных web-сервисом, типами XML и JSON.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Импорт данных из 1С в Oracle / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]