Хранение столбцов CHAR или CLOB sqlplus в переменной сценария оболочки - PullRequest
1 голос
/ 04 марта 2011

У меня проблемы с хранением значений столбцов в переменных сценария оболочки, если они включают пробелы, поскольку все результаты разбиты на пробелы вместо фактических значений столбцов.

Например, вот что я получил сейчас:

set -A SQL_RESULTS_ARRAY `sqlplus -s un/pass@database << EOF
SET ECHO OFF
SET FEED OFF
SET HEAD OFF
SET SPACE 0
SELECT EMAIL_SUBJECT, MAIL_TO FROM EMAIL_TABLE;
EOF`

echo "${SQL_RESULTS_ARRAY[0]}"
echo "${SQL_RESULTS_ARRAY[1]}"

Это не работает, потому что значение EMAIL_SUBJECT представляет собой целое предложение, то есть "Тест предмета сообщения", поэтому эти эхо просто заканчивают тем, что печатают

Message
subject

Вместо

Message subject test
email1@email.com email2@email.com

В принципе, как мне получить только два элемента в массиве (по одному на столбец) вместо пяти (по одному на слово)? Это вообще возможно с одним соединением? (Я бы предпочел не устанавливать новое соединение для каждого столбца)

РЕДАКТИРОВАТЬ: Еще одна вещь, еще один из моих столбцов CLOB - это EMAIL_BODY, который может быть в основном любым текстом - поэтому я бы предпочел не иметь предустановленного разделителя, поскольку EMAIL_BODY может иметь все виды запятых, каналов, новых строк, и т.д ...

Ответы [ 4 ]

2 голосов
/ 04 марта 2011

Ключ, который вам не хватает, - это установить IFS оболочки (внутренний разделитель полей) так, чтобы он совпадал с результатами вашего запроса. Вот сеанс ksh:

$ results="Message subject test,email1@email.com email2@email.com"
$ set -A ary $results
$ for i in 0 1 2 3 4; do print "$i. ${ary[$i]}"; done
0. Message
1. subject
2. test,email1@email.com
3. email2@email.com
4. 
$ IFS=,
$ set -A ary $results
$ for i in 0 1 2 3 4; do print "$i. ${ary[$i]}"; done
0. Message subject test
1. email1@email.com email2@email.com
2.
3.
4.

Возможно, вы захотите сделать что-то вроде этого:

results=`sqlplus ...`
old_IFS="$IFS"
IFS=,
set -A SQL_RESULTS_ARRAY $results
IFS="$old_IFS
print "${SQL_RESULTS_ARRAY[0]}"
print "${SQL_RESULTS_ARRAY[1]}"
0 голосов
/ 04 марта 2011

Прочтите о "внутреннем разделителе полей" bash $ IFS

, по умолчанию он установлен в пробел, что может вызвать вашу проблему.

0 голосов
/ 04 марта 2011

Попробуйте добавить двойные кавычки, используя конкатенацию строк в операторе выбора.Кэшированные элементы массива допускают пробелы (по крайней мере, в bash).

0 голосов
/ 04 марта 2011

Вы можете попытаться установить COLSEP и отделить его значением.

...