Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: id загрузки в sqlloader

Имеются файлы с разделителями, имеются ctl-файлы для загрузки их loader-ом в базу.
Но при каждой загрузке в ctl приходится вручную проставлять т.н. loadId.
Вопрос, как это сделать по средством батника?
Как вариант, старые ctl удалять, а с помощью sqlplus генерить spool-ом или еще как новые ctl, где id загрузки доставать из сиквенса.
Но это тоже кажется не совсем нормальным. Как это делают белые люди? )
Ответ:
Грузчик
Имеются файлы с разделителями, имеются ctl-файлы для загрузки их loader-ом в базу.
Но при каждой загрузке в ctl приходится вручную проставлять т.н. loadId.
Вопрос, как это сделать по средством батника?
Как вариант, старые ctl удалять, а с помощью sqlplus генерить spool-ом или еще как новые ctl, где id загрузки доставать из сиквенса.
Но это тоже кажется не совсем нормальным. Как это делают белые люди? )


Годный способ

Варианты
- external table и загрузка dbms_scheduler с укладывание данных в целевую таблицу
- id как текущее время
- значение из таблицы/функции
Вопрос: Oracle 11g Загрузка данных в бд

Добрый день!

Есть программа по загрузке данных в пустую таблицу (выполняется insert into ...). В программе при загрузке данных выполняется commit каждые 1000 записей. Если во время загрузки данных подключиться к бд и выполнить запрос count(*), то количество записей будет не 1000,2000,3000 и т.д., а например 2321. Почему количество записей не кратно 1000?

Заранее спасибо.
Ответ: greg_123,

автор
Если во время загрузки данных подключиться к бд и выполнить запрос count(*), то количество записей будет не 1000,2000,3000 и т.д., а например 2321. Почему количество записей не кратно 1000?

Задача 1: в магазине А находятся 321 яблоко. Веселый садовник привозит по 1000 (четко). Вопрос: сколько будет яблок в магазине А после приезда садовника?
Задача 2: Садовник набухался и перевернул машину (ибо "программа по загрузке данных самосвал делал местный кузнец Федя") Вопрос: А сколько в общем-то собирался привести садовник? Может, 456456 яблок.
Вопрос: Как определяется порядок, в котором ресолвятся классы при загрузке jar файла ?

Пытаюсь загрузить пакет sqljet
Пишут что purejava и зависимостей нет и работает с 5 явой. При загрузке некоторые классы пытаются ресолвиться на классы, которые еще не загружены. Как поменять порядок, или можно попробовать их активировать после загрузки ?

К сообщению приложен файл (loadjar.log - 126Kb)
Ответ:
Слона то я и не заметил
Имя схемы ненайденного класса не соответствует пользователю в команде. Не пытался ли кто загрузить классы до этого с публик-синонимами?


Фактически я гружу под пользователем dis_sys интересно почему оно ищет класс org/tmatesoft/sqljet/core/internal/map/SqlJetMapTable без префикса dis_sys так и должнобыть ?

После неудачной загрузки я чищу вот таким скриптом

+

DECLARE
CURSOR curs1 IS
SELECT --obj.*
OBJECT_NAME,
OBJECT_TYPE,
dbms_java.longname(OBJECT_NAME) as LOBJECT_NAME
FROM SYS.ALL_OBJECTS obj
where obj.owner='DIS_SYS' and obj.CREATED >= trunc(sysdate) and obj.OBJECT_TYPE like 'JAVA%'
order by CASE OBJECT_TYPE WHEN 'JAVA SOURCE' THEN 1 WHEN 'JAVA CLASS' THEN 2 ELSE 3 END;

ONAME VARCHAR2(30);
LONAME VARCHAR2(255);
OTYPE VARCHAR2(30);

BEGIN
open curs1;
LOOP
fetch curs1 into ONAME, OTYPE, LONAME;
if curs1%notfound then EXIT;
null;
else
begin
if OTYPE='JAVA CLASS' THEN
execute immediate 'DROP JAVA CLASS "' || ONAME || '"';
ELSIF OTYPE='JAVA SOURCE' THEN
execute immediate 'DROP JAVA SOURCE "' || ONAME || '"';
ELSE
execute immediate 'DROP JAVA RESOURCE "' || ONAME || '"';
end if;
exception
when others then
if OTYPE = 'JAVA CLASS' then
ONAME := DBMS_JAVA.derivedFrom(ONAME, 'DIS_SYS', 'CLASS');
execute immediate 'DROP JAVA SOURCE "' || ONAME || '"';
end if;
end;
DBMS_OUTPUT.put_line('DROP '||LONAME);
end if;
END LOOP;
CLOSE curs1;
END;
Вопрос: Автоматическое открытие форм при загрузке БД в ЗАДАННОЙ последовательности

Здравствуйте!
Подскажите пожалуйста, как открыть формы при загрузке именно в заданной последовательности.
Я имею в виду, что когда пишешь в форме код на открытие других форм, то последняя форма всегда та, из которой открывались другие. Как же написать код, чтобы первая форма была та, из которой запускаются остальные, а не наоборот???
Ответ:
Сообщение от mobile
передать фокус на первую
не совсем то, что задумывал... вопрос не в передаче фокуса, а в порядке расположения форм слева на право. почему то в загрузке БД стоит основная форма из которой вызываются остальные, но порядок их расположения обратный - справа на лево.

Добавлено через 12 минут
пока нашёл решение:
-создать пустую форму
-в созданной пустой форме написать код открытия окон в нужной последовательности
-так же в этой пустой форме написать код его закрытия и передачи фокуса на нужное окно
-пустую форму назначить в открываемую автоматически при загрузке БД
Вопрос: SSIS, загрузка xml

Коллеги, пытаюсь сделать загрузку xml-документа с inline-схемой через SSIS-пакет.
Всегда загружено 0 строк, пакет завершается успешно.

В чем может быть причина и как нужно поправить dtsx?

XML-документ:
+

<?xml version="1.0" encoding="utf-16"?>
<DataSet>
  <xs:schema id="MosPrime" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
    <xs:element name="MosPrime" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
      <xs:complexType>
        <xs:choice minOccurs="0" maxOccurs="unbounded">
          <xs:element name="MP">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="MP_Date" type="xs:dateTime" />
                <xs:element name="TON" type="xs:decimal" minOccurs="0" />
                <xs:element name="T1W" type="xs:decimal" minOccurs="0" />
                <xs:element name="T2W" type="xs:decimal" minOccurs="0" />
                <xs:element name="T1M" type="xs:decimal" minOccurs="0" />
                <xs:element name="T2M" type="xs:decimal" minOccurs="0" />
                <xs:element name="T3M" type="xs:decimal" minOccurs="0" />
                <xs:element name="T6M" type="xs:decimal" minOccurs="0" />
              </xs:sequence>
            </xs:complexType>
          </xs:element>
        </xs:choice>
      </xs:complexType>
      <xs:unique name="Constraint1" msdata:PrimaryKey="true">
        <xs:selector xpath=".//MP" />
        <xs:field xpath="MP_Date" />
      </xs:unique>
    </xs:element>
  </xs:schema>
  <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
    <MosPrime>
      <MP diffgr:id="MP1" msdata:rowOrder="0">
        <MP_Date>2015-08-03T00:00:00+03:00</MP_Date>
        <TON>10.8000</TON>
        <T1W>11.0400</T1W>
        <T2W>11.2700</T2W>
        <T1M>11.7600</T1M>
        <T2M>11.9100</T2M>
        <T3M>11.9700</T3M>
        <T6M>12.0300</T6M>
      </MP>
      <MP diffgr:id="MP2" msdata:rowOrder="1">
        <MP_Date>2015-08-04T00:00:00+03:00</MP_Date>
        <TON>10.5500</TON>
        <T1W>10.9600</T1W>
        <T2W>11.1900</T2W>
        <T1M>11.7200</T1M>
        <T2M>11.8300</T2M>
        <T3M>11.9000</T3M>
        <T6M>11.9400</T6M>
      </MP>
      <MP diffgr:id="MP3" msdata:rowOrder="2">
        <MP_Date>2015-08-05T00:00:00+03:00</MP_Date>
        <TON>10.5000</TON>
        <T1W>10.9500</T1W>
        <T2W>11.1700</T2W>
        <T1M>11.7100</T1M>
        <T2M>11.8000</T2M>
        <T3M>11.8700</T3M>
        <T6M>11.9200</T6M>
      </MP>
      <MP diffgr:id="MP4" msdata:rowOrder="3">
        <MP_Date>2015-08-06T00:00:00+03:00</MP_Date>
        <TON>10.5200</TON>
        <T1W>10.9700</T1W>
        <T2W>11.1700</T2W>
        <T1M>11.7100</T1M>
        <T2M>11.7900</T2M>
        <T3M>11.8600</T3M>
        <T6M>11.9100</T6M>
      </MP>
      <MP diffgr:id="MP5" msdata:rowOrder="4">
        <MP_Date>2015-08-07T00:00:00+03:00</MP_Date>
        <TON>10.5000</TON>
        <T1W>10.9900</T1W>
        <T2W>11.1800</T2W>
        <T1M>11.7100</T1M>
        <T2M>11.7900</T2M>
        <T3M>11.8400</T3M>
        <T6M>11.8900</T6M>
      </MP>
      <MP diffgr:id="MP6" msdata:rowOrder="5">
        <MP_Date>2015-08-10T00:00:00+03:00</MP_Date>
        <TON>10.6200</TON>
        <T1W>11.0400</T1W>
        <T2W>11.2000</T2W>
        <T1M>11.7000</T1M>
        <T2M>11.7700</T2M>
        <T3M>11.8300</T3M>
        <T6M>11.8900</T6M>
      </MP>
      <MP diffgr:id="MP7" msdata:rowOrder="6">
        <MP_Date>2015-08-11T00:00:00+03:00</MP_Date>
        <TON>10.7600</TON>
        <T1W>11.1600</T1W>
        <T2W>11.2800</T2W>
        <T1M>11.7000</T1M>
        <T2M>11.7600</T2M>
        <T3M>11.8300</T3M>
        <T6M>11.8900</T6M>
      </MP>
      <MP diffgr:id="MP8" msdata:rowOrder="7">
        <MP_Date>2015-08-12T00:00:00+03:00</MP_Date>
        <TON>10.8400</TON>
        <T1W>11.1600</T1W>
        <T2W>11.2900</T2W>
        <T1M>11.6800</T1M>
        <T2M>11.7400</T2M>
        <T3M>11.8100</T3M>
        <T6M>11.8800</T6M>
      </MP>
      <MP diffgr:id="MP9" msdata:rowOrder="8">
        <MP_Date>2015-08-13T00:00:00+03:00</MP_Date>
        <TON>10.9300</TON>
        <T1W>11.1900</T1W>
        <T2W>11.3100</T2W>
        <T1M>11.7300</T1M>
        <T2M>11.7700</T2M>
        <T3M>11.8400</T3M>
        <T6M>11.9100</T6M>
      </MP>
      <MP diffgr:id="MP10" msdata:rowOrder="9">
        <MP_Date>2015-08-14T00:00:00+03:00</MP_Date>
        <TON>11.3900</TON>
        <T1W>11.3500</T1W>
        <T2W>11.4400</T2W>
        <T1M>11.7900</T1M>
        <T2M>11.8000</T2M>
        <T3M>11.8700</T3M>
        <T6M>11.9300</T6M>
      </MP>
      <MP diffgr:id="MP11" msdata:rowOrder="10">
        <MP_Date>2015-08-17T00:00:00+03:00</MP_Date>
        <TON>11.4500</TON>
        <T1W>11.4900</T1W>
        <T2W>11.5300</T2W>
        <T1M>11.7600</T1M>
        <T2M>11.8000</T2M>
        <T3M>11.8500</T3M>
        <T6M>11.9900</T6M>
      </MP>
      <MP diffgr:id="MP12" msdata:rowOrder="11">
        <MP_Date>2015-08-18T00:00:00+03:00</MP_Date>
        <TON>11.4200</TON>
        <T1W>11.4600</T1W>
        <T2W>11.5300</T2W>
        <T1M>11.7800</T1M>
        <T2M>11.8200</T2M>
        <T3M>11.8600</T3M>
        <T6M>11.9500</T6M>
      </MP>
      <MP diffgr:id="MP13" msdata:rowOrder="12">
        <MP_Date>2015-08-19T00:00:00+03:00</MP_Date>
        <TON>11.4700</TON>
        <T1W>11.5500</T1W>
        <T2W>11.6100</T2W>
        <T1M>11.7600</T1M>
        <T2M>11.8700</T2M>
        <T3M>11.9100</T3M>
        <T6M>12.0100</T6M>
      </MP>
      <MP diffgr:id="MP14" msdata:rowOrder="13">
        <MP_Date>2015-08-20T00:00:00+03:00</MP_Date>
        <TON>11.4400</TON>
        <T1W>11.5700</T1W>
        <T2W>11.6200</T2W>
        <T1M>11.7700</T1M>
        <T2M>11.8800</T2M>
        <T3M>11.9600</T3M>
        <T6M>12.0900</T6M>
      </MP>
    </MosPrime>
  </diffgr:diffgram>
</DataSet>



К сообщению приложен файл. Размер - 23Kb
Ответ: Нагуглил xslt-преобразование, с ним загрузка работает

+
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
   <xsl:output method="xml" indent="no" />
   <xsl:template match="/|comment()|processing-instruction()">
      <xsl:copy>
         <xsl:apply-templates />
      </xsl:copy>
   </xsl:template>
   <xsl:template match="*">
      <xsl:element name="{local-name()}">
         <xsl:apply-templates select="@*|node()" />
      </xsl:element>
   </xsl:template>
   <xsl:template match="@*">
      <xsl:attribute name="{local-name()}">
         <xsl:value-of select="." />
      </xsl:attribute>
   </xsl:template>
</xsl:stylesheet>


но получается коряво - после преобразования я теряю данные о inline-схеме и вынужден где-то хранить xsd...
Вопрос: Автоматизация загрузки данных в MS SQL Server

Добрый день всем.

Есть вопрос - какие есть способы автоматизировать загрузку данных в MS SQL из текстовых файлов в сетевой папке?
То, что в любом случае будет создаваться job на сервере, который будет выполняться по расписанию, это ясно.
А что поместить внутрь Job-a?
Первый ответ - создать .dtsx-пакет, загрузить на сервер, и засунуть в job для регулярного запуска пакета.
Второй вариант - создание процедуры, в которой данные будут читаться при помощи OpenQuery, процедура запускается job-ом.
Третий вариант - запуск из job-a bcp.exe при помощи xp_cmdshell.

А какие ещё есть варианты?
Ответ: DaniilSeryi,

4. Напишите приложения для загрузки. Запускайте планировщиком Windows.
Вопрос: файловая загрузка в ЕАРе

Доброго времен суток.

Есть необходимость с помощью J2EE-приложения (на WAS) загрузить в БД Оракл записи из плоского текстового файла. Записей много, сотни тысяч. Загрузить надо быстро. Насколько я понимаю, стандартное решение для этого -- оракловый SQL Loader. Вызвать соответствующий батник из Джавы -- и вуаля.

Однако задача осложняется тем, что по административным причинам нельзя поставить ораклового клиента на тот же сервер, где стоит WAS. А тупая загрузка на Джаве, боюсь, будет работать долго. Что можно придумать?

Если есть какие мысли по этому поводу -- посоветуйте плз.

Заранее спасибо.
Ответ: Если нельзя поставить oracle-клиент на одну машину, его можно поставить на другую. Передать туда файл - и вуаля. Детали реализации, разумеется, могут быть самыми разными.

batch-загрузка, кстати, не обязательно проиграет sql*loader'у. Точнее, насколько я помню, если у таблицы есть триггеры, у sql*loader'а де-факто будет та же пачечная вставка.
Вопрос: Ежедневная загрузка 100млн записей из файла.Баланс между скоростью загрузки и доступом?

Добрый день.

Ежедневно приходит файл с почти 100кк записями в CSV. Полей всего 2, типы полей varchar2(20).

Задача: загрузить за приемлемое время (ниже примерно будет, что такое - "приемлемое") ночью этот файл, при этом по возможности обеспечить максимальную скорость доступа к данным. Это данные некоторого справочника и необходимы только на чтение.

Что делал:
1) для начала попробовал создать внешнюю таблицу и загнать их туда. Время выборки по
where field1=XXX and
         field2=YYY

около 15 секунд, что очень долго.
2) создал обычную таблицу и перегнал данные методом
INSERT INTO normal_table SELECT * FROM external_table 

что заняло около 4-ех минут (что в моих реалиях практически молниеносно)
Как и ожидалось, без индексов время выборки практически не изменилось.
3) заново создал обычную таблицу с одним уникальным индексом по двум полям и попытался перегнать все тем же методом
INSERT INTO normal_table SELECT * FROM external_table

что заняло 13 часов 40 минут. Это нереальное время.
4) попробовал тоже самое, что и в пункте 3, но индекс поставил normal. Тут немного неясно вышло. На 2кк записей отработало за 83 секунды, на 20кк - за 2500 секунд. Но это может быть потому что в этот момент пользователи запускали на сервере некие ресурсоемкие задачи.

Вопросы:
Вопрос 1: ускорит ли время загрузки в таблицу с индексами SQL Loader с директивой direct и вообще возможна ли эта директива при индексах? Или выигрыш минимален?
Вот очень много инфы, я зарылся и уже вообще перестал все понимать, глаз "замылился".
Вопрос 2: Как правильно организовать индексирование (какой тип индекса выбрать, индексировать ли при insert-е или постфактум и т.д.) чтобы выдержать грамотный баланс между скоростью загрузки и скоростью доступа. Скорость загрузки я думаю приемлима около часа-двух, скорость доступа не больше одной секунды. Что еще можете посоветуете?

Заранее благодарю.
Ответ:
Elic
MERGE

Хм... А мы разве получим выигрыш по времени с учетом того, что мерджить будем с external_table? Или сделать еще одну временную таблицу и мерджить уже ее?
Elic
IOT

Интересно, спасибо. Буду читать.
ora601
Если у Вас партиционирование в таргет таблице будет по дню и больше ничего туда не грузиться,
то идеальный вариант будет : EXTERNAL TABLE > normal_table (+parallel DML)> build index (bitmap ? parallel) > partition exchange including indexes without validation.

В этом случае наиболее затратной операцией будет билд индекса, который Вы сделаете в параллель, ну и insert as select, который занимает 4 минуты, а с PDML должен быть еще быстрее. Partition exchange же работает моментально.

Спасибо, попробую.

Вячеслав Любомудров
Что-то похоже на изменения из файла в таблицу

Дада... Тоже самое, паспорта :)
Вопрос: помогите спланировать процесс загрузки xml файлов в базу.

добрый день!

Есть задача ежемесячно загружать обновление ЕГРЮЛ в базу данных.
Обновления присылают в виде однотипных XML файлов.
Каждый файл раскладывается на 16 таблиц.

Изначально была мысль описать EXTERNAL TABLE TYPE ORACLE_LOADER, и загрузку INSERT ALL в 16 целевых таблиц.
Но структура XML не совсем табличная, и пришлось отказать.

Сейчас пробую вариант
16 view с запросами вида XMLTable
SELECT ..
FROM (
'/EGRUL_UL_DATA/UL'
PASSING XMLTYPE(BFILENAME('EGRUL_DIR', 'egrul.xml'), NLS_CHARSET_ID('CL8MSWIN1251'))
COLUMNS
А после этого выгружать данные в целевые таблицы используя INSERT /*+ APPEND */
Хотелось бы вести обработку каждого файла в одной транзакции, т.e commit после загрузки 16-й таблицы.
На момент загрузки отключаю ref constraint, триггеров на таблицах нет.

Первый insert проходит нормально, на второй пишет
SQL Error: ORA-12840: невозможен доступ к удаленной таблице после транзакции параллельной/вставляемой прямой загрузки
12840. 00000 - "cannot access a remote table after parallel/insert direct load txn"
*Cause: Within a transaction, an attempt was made to perform distributed
access after a PDML or insert direct statement had been issued.

Т е доступ XMLTABLE - remote table?
Есть воркараунд для этого ?
Ответ:
Dmitry.
если есть возможность представить содержимое файла в виде xmltype
то можно все представить в виде pl/sql блока примерно так:

declare
	T_XML xmltype:=...;
begin

	insert 
		into t1(f1,f2,f3...)
		select  f1,f2,f3...
		FROM XMLTABLE('/xpath'
				PASSING ( T_XML )
				COLUMNS
					f1             varchar2(100)   PATH 'f1path',
					f2             timestamp       PATH 'f2path',
					f3             number          PATH 'f3path',
					...
			) xmlt
	;
	...
	insert into t16
	...
	commit;
end;


А можно поподробней, не сталкивался с этим.

На каком этапе производится запрос из файла ?
Вопрос: bcp.exe загрузка по шаблону

Доброго времени суток
Нужна помощь
Есть: Ноотбук Win 7 x64 Ru, MS SQL Server 2012, 16 Гб оперативки и 500 Гб HDD

В БД установлен режим журналирования BULK_LOGGED
надо в БД закачать CSV файл по шаблону

Файл шаблона сформирован с помощью bcp.exe
bcp DBName.dbo.TblName format nul -f ImportFile.fmt -n -t^ -r\n

Файл шаблона (урезан до 3 полей - в оригинале 18 полей, но типы те же):

11.0
3
1 SQLDATE 1 3 "^" 1 DATA ""
2 SQLCHAR 2 25 "^" 2 ACCOUNT Cyrillic_General_CI_AS
3 SQLFLT8 1 8 "\n" 3 INDT ""

файл CSV (урезан до 2 записей - в оригинале более 4 млн строк и 18 полей):

01.04.2014^47408810800001001910^10,2
02.05.2015^45818810500002020015^200,8

Не получается закачать информацию с помощью bcp.exe - пытаюсь так:
bcp DBName.dbo.TblName in ImportFile.csv -f ImportFile.fmt -T

постоянно дает ошибку:
Invalid filed size for datatype

Пробовал разные форматы даты и чисел - результат тот-же :(

Если в таблице поля сделать как varchar(10), varchar(25), varchar(30), изменить шаблон типа:
11.0
3
1 SQLCHAR 0 10 "^" 1 DATA ""
2 SQLCHAR 0 25 "^" 2 ACCOUNT Cyrillic_General_CI_AS
3 SQLCHAR 0 30 "\n" 3 INDT ""

- все катит (реальный файл грузит быстро), но...
НУЖНА ЗАГРУЗКА ПО ТИПАМ ДАННЫХ - т.е. дата должна прогрузится как дата, число как число и т.п.

Подскажите что делать, куда рыть, другие варианты загрузки...
(возможно изменение представления данных в CSV файле)

использую BCP т.к. критично время загрузки.

P/S/
В T-SQL не очень шарю, так что если можно, то про-проще плиз...
Перейти на Oracle и юзать Loader - не предлагать ;-)
Ответ: Вот что получилось:
1. поменял в csv представление даты с dd.mm.yyyy на yyyy-mm-dd
2. в числах установил разделитель точку 200,8 -> 200.8
3. csv переименовал в dat
4. запустил bcp DBName.dbo.TblName in ImportFile.dat -c -t^ -T
без всякого шаблона...
И СВЕРШИЛОСЬ... все грузится пулей...

Всем огромное спасибо за помощь!