Вставьте в таблицу Oracle в цикле

Я полагаю, что "опция" размера стопки ядра изменения давно в прошлом...

4
28.09.2016, 23:24
2 ответа

Вот версия сценария, который работает и чинит некоторые вещи, которые Вы не могли рассмотреть:

#!/bin/bash
(
    echo '-- some startup SQL*plus code'
    echo 'set echo off;'
    echo '-- etc'
    find /home/devuser -name 'BI*' -type f |
    awk -- '{
                gsub("\047", "\047\047", $0);
                printf("INSERT INTO table1(file_name,status) " \
                       "VALUES(\047%s\047, \047N\047);\n", $0);
            }'

    echo 'COMMIT;'
) | sqlplus -s schema_name/passwd

Функции:

  • Выбирает только файлы (-type f в find) соответствие шарику ‘BI*’ — видит страницу справочника для find(1) для различных доступных типов файлов.
  • Именами файлов Escape, содержащими одинарные кавычки (' → '') так вывод, является допустимый SQL. \047 восьмеричный код ASCII одинарной кавычки, полезной, так как код awk уже является внутренними одинарными кавычками.
  • Быстрее, чем расширение обратной галочки.
  • Не учтите | sqlplus ... часть последней строки и Вы видите сгенерированный сценарий SQL.

Ограничения:

  • Не работает с именами файлов, содержащими новые строки или любые другие непечатаемые символы.
  • Может не работать с символами неASCII. Это зависит от ряда факторов, некоторые на стороне POSIX, некоторые на стороне Oracle (и некоторые, вероятно, в самом SQL*plus).
  • Это - не обязательно лучший способ (лучшие люди несомненно согласятся со своими версиями).

Сгруппированный раздел в начале генерирует сценарий, включая пролог (полезный для сообщения SQL*plus, что сделать с некоторыми его 'более хорошими' функциями), и эпилог для фиксации транзакции.

Что случилось с Вашей собственной версией сценария:

  • Присвоения похожи на это: VAR=foo. Нет VAR = foo (да, это имеет значение; последний попробует к команде выполнения VAR с аргументами = и foo, не выполняют переменное присвоение),
  • Если Вы хотите $names расшириться до результатов find команда, необходимо сказать names=$(find ...) или names=`find ...`, нет names=find ....
  • Что-либо после <<EOF отправляется в SQL*Plus, таким образом, фрагмент сценария удара Вы включаете (с for цикл), интерпретируется SQL*Plus, не колотят. Это не допустимый SQL, и SQL*Plus естественно дросселирует на нем.
  • Тело for цикл является SQL-оператором, но Вы ожидаете, что это будет interprered ударом, который не является правильным. Должен быть echo перед SQL insert оператор (и конечно вся вещь из <<EOF раздел).
  • Вы не учли EOF самостоятельно. <<EOF означает ‘чтение, пока со строкой не встречаются, который запускается с EOF’.
3
27.01.2020, 20:52
for VARIABLE in 1 2 3 4 5 .. N
do
    command1
    command2
    commandN
done <<anything given here is taken as variable>>

Это - базовый синтаксис и после done, фиксация должна быть дана в следующей строке.

Таким образом, Ваш код должен быть.

#!/bin/bash
names = find  /home/devuser -name 'BI*'
sqlplus -s  schema_name/passwd << EOF
for name in {names[@]}
do
insert into table1(file_name,status) values('$name','N'); 
done 
commit; 
exit
3
27.01.2020, 20:52

Теги

Похожие вопросы