Глобальная временная таблица и массовый сбор

Я собираюсь объяснить вам мою проблему. Мне нужно преобразовать сценарий t-sql в сценарий pl/sql. В t-sql есть мой код:

CREATE TABLE #temp_tb ( temp_row nvarchar(max)) 
if @@error <> 0 goto lbl_end

DECLARE @bulk_cmd varchar(1000)
set @bulk_cmd = 'BULK INSERT #temp_tb FROM ''c:\Communication\Test\MSG_IN\'+'$(nomfic)'+''' WITH 
( 
CODEPAGE = ''RAW'',
ROWTERMINATOR = '''+CHAR(10)+''',
DATAFILETYPE = ''WIDECHAR'' 
)'

exec (@bulk_cmd)
if @@error <> 0 goto lbl_end

И после большого количества документов и форумов оракула я пишу это:

CREATE GLOBAL TEMPORARY TABLE temp_tb ( temp_row NCHAR(MAX)) ON COMMIT DELETE ROWS;
BEGIN
EXCEPTION
    WHEN OTHERS THEN GOTO lbl_end;
END;                               

DECLARE bulk_cmd varchar2(1000);

bulk_cmd := 'BULK INSERT temp_tb FROM ''c:\Communication\Test\MSG_IN\'+'$(nomfic)'+''' WITH 
( 
CODEPAGE = ''RAW'',
ROWTERMINATOR = '''+CHAR(10)+''',
DATAFILETYPE = ''WIDECHAR'' 
)';

BEGIN
  exec (bulk_cmd);
EXCEPTION
    WHEN OTHERS THEN GOTO lbl_end;
END;

Но у меня здесь ошибка NCHAR(MAX). Я должен поставить большое значение, например 100000? Если я поставлю это, он вернет мне ошибку после синтаксической ошибки EXECEPTION...

С другой стороны, если кто-то может сказать мне, как адаптировать мой массовый сбор... Я не нашел ни одного документа по массовому сбору для интегрированного файла, такого как я...

Надеюсь, я понял, потому что мне действительно сложно объяснить... Я новичок в Oracle (PL/SQL)...

Спасибо за помощь, ребята, еще раз

РЕДАКТИРОВАТЬ: я запускаю этот скрипт с помощью .bat. Я взял параметры, которые заполнил '$(nomfic)' значениями в зависимости от параметров.


person S. Guillaume    schedule 23.09.2015    source источник
comment
проверьте эту ссылку weblogs.sqlteam.com/jamesw/archive/2010/07/28/   -  person SubqueryCrunch    schedule 23.09.2015
comment
Итак, я знаю, что «максимальное значение» равно 2000. Спасибо, есть идеи для массового сбора в моем случае?   -  person S. Guillaume    schedule 23.09.2015
comment
проверьте последний ответ здесь stackoverflow.com/questions/7749947/   -  person SubqueryCrunch    schedule 23.09.2015
comment
Спасибо ! Но мой файл .txt, его можно адаптировать? Потому что мой bulk_cmd должен оставаться таким в переменной. Итак, я не могу адаптировать массовую вставку (T-SQL) к массовой сборке (PL/SQL)?   -  person S. Guillaume    schedule 23.09.2015
comment
Здесь много чего не так. Временные таблицы в Oracle работают иначе, чем в SQL Server. Ваш сценарий не должен создавать глобальную временную таблицу — вы создаете ее один раз, а затем повторно используете при необходимости. Кроме того, ваш первый анонимный блок ничего не делает. Кроме того, exec не является допустимой командой PL/SQL - для запуска динамического SQL вы должны использовать EXECUTE IMMEDIATE, но здесь это не требуется. Ваш оператор BULK INSERT также не будет работать.   -  person Jeffrey Kemp    schedule 23.09.2015
comment
@JeffreyKemp Спасибо вам! Так как же создать временную таблицу? Локальная временная таблица? Спасибо за Exec ... я скучаю по нему ... Мой файл для интеграции может иметь 10 000-100 000 строк, так как я могу управлять этим массовым сбором? Я потерялся... Спасибо за ответ   -  person S. Guillaume    schedule 23.09.2015
comment
У вас есть правильная команда для создания временной таблицы в Oracle. Временные таблицы в Oracle — это [глобальные] постоянные объекты, содержащие временные данные, которые являются локальными для сеанса. [Выделение добавлено] stackoverflow.com/questions/8912871/   -  person Shannon Severance    schedule 24.09.2015
comment
Чтобы загрузить файл из файловой системы, вы должны использовать внешние таблицы (рекомендуется) или загрузчик SQL. BULK COLLECT предназначен для загрузки данных в/из массивов PL/SQL и не имеет ничего общего с файлами.   -  person Jeffrey Kemp    schedule 24.09.2015
comment
@ShannonSeverance @JeffreyKemp Спасибо вам, ребята. Я следую вашим советам и адаптирую свой код следующим образом: CREATE OR REPLACE DIRECTORY ext_tab_data AS 'c:\Hardis\reflex\Communication\HM\MSG_IN\'; CREATE TABLE tem_tb( temp_row NCHAR(2000) ) ORGANIZATION EXTERNAL ( TYPE ORACLE_LOADER DEFAULT DIRECTORY ext_tab_data ACCESS PARAMETERS ( RECORDS DELIMITED BY NEWLINE ( temp_row VARCHAR2(1000) ) ) LOCATION ('$(nomfic)'+'.txt') ); Но разработчик SQL возвращает код ошибки ORA-00910, но я уважаю длину типов данных NCHAR... я не понимаю, в чем моя ошибка..   -  person S. Guillaume    schedule 24.09.2015
comment
Я не уверен, что означает LOCATION ('$(nomfic)'+'.txt', но это выглядит неправильно. Это разрешается литералом в вашем скрипте или вы ожидаете, что SQL Developer справится с этим? Также внешние таблицы читают файлы с сервера базы данных - находится ли «c:\Hardis\reflex\Communication\HM\MSG_IN\» на сервере и доступен ли процесс Oracle? Если это так, и ваша единственная проблема заключается в слишком большом значении ошибки, кажется, что это часть вашего кода, которую мы не можем видеть.   -  person William Robertson    schedule 20.10.2015