Как вставить параметр из параллельной программы (файл.prog) в таблицу с помощью sql*файл управления загрузчиком, созданный динамически

#bash #oracle #oracle-sqldeveloper #sql-loader

#удар #Oracle #oracle-разработчик sqld #sql-загрузчик

Вопрос:

У меня есть .файл prog из основной программы, созданной в приложениях oracle. Я отправляю параметр из приложений oracle с хост-программой, и я могу получить к нему доступ в .прог-файл, подобный этому, например

echo "5 Concurrent Program Parameter 1 : " ${5}

Мне нужно использовать этот параметр ($5) в файле управления (.ctl), где я вставлю несколько столбцов и этот параметр в новую таблицу. например

 LOAD DATA INSERT INTO TABLE TABLE_NAME FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS ( COL1, COL2, DATA_FROM_PROG (5) =gt; ** here i need to insert that data from the .prog file** )  

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

напр. sqlldr userid=user/pass data=$5 control=control.ctl

Спасибо.

Ответ №1:

Я бы не знал, так как я ничего не знаю о приложениях Oracle. ни файлов «.prog».

Обходной путь — с моей точки зрения — состоял бы в том, чтобы

  • загружайте только известные данные (из исходного файла)
  • data_from_prog будет указано в качестве поля заполнителя (и заполнено NULL значениями (если trailing nullcols указано))
  • после завершения сеанса загрузки обновите этот столбец в приложениях Oracle. — тогда вы бы использовали простое update утверждение; вы находитесь в мире (PL/)SQL, такой запрос легко написать (по крайней мере, я на это надеюсь)

Комментарии:

1. Я понимаю, что вы имеете в виду, но это не сработало бы для меня, потому что в этом случае я должен следовать инструкциям для этого. Действительно, есть и другие способы сделать это, то, что я ищу, будет включать использование сценариев bash для редактирования файла .cvs из .prog. Все равно спасибо!

2. Нет проблем; Я надеюсь, что в конце концов у вас все получится. Удачи!

Ответ №2:

Используя скрипт Bash в .файл prog для динамического создания управляющего файла (.ctl) с нуля, похоже, работает, и я также могу использовать параметры. Так что в .файл prog, который у нас был бы:

 echo "5 Concurrent Program Parameter 1 : " ${5} /*this is only to test it*/  /* *Printf* with *gt;* command will create and edit a file. Alternative *Printf* with *gt;gt;* would append to the file*/  printf "LOAD DATAn INFILE 'path_to_csv_file.csv'n /*this is data for col1, col2 etc*/ INSERT INTO TABLE TABLE_NAMEn FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'n TRAILING NULLCOLSn (COL1,n COL2,n DATA_FROM_PROG CONSTANT ${5})" gt; [name and path to control file (e.g./folder/control.ctl)]  

Таким образом, когда .файл prog выполняется, он динамически создаст файл .ctl, который будет иметь нужный нам параметр (${5}). И мы также можем добавить что-то подобное для запуска файла .ctl

 sqlldr userid=user/pass control=[path_to_control]control.ctl log=track.log  

Также убедитесь, что вы избегаете кавычек ' и двойных кавычек " , потому что в противном случае вы получите некоторые ошибки.