#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
Также убедитесь, что вы избегаете кавычек '
и двойных кавычек "
,
потому что в противном случае вы получите некоторые ошибки.