Dynami c массив l oop с использованием sqlplus в bash unix - PullRequest
0 голосов
/ 03 мая 2020

У меня есть таблица с несколькими столбцами, и я хочу извлечь два столбца RCRD_ID и ACCOUNT, которые я отсортировал

RCRD_ID -----> ACCOUNT

630566DAD135E9A11 -----> JZZ35
630566DAD135E9A12 -----> EGC46
630566DAD135E9A13 -----> 85955
630566DAD135E9A14 -----> EGC36
6E5305 ----> 85044
630566DAD135E9A16 -----> JZZ53
630566DAD135E9A17 -----> 09686
630566DAD135E9A18 -----> 85044
630566DAD135E9A19 -----> JZ53
630566DAD135E9A110 -----> 09686
630566DAD135E9A111 -----> 09686

Я хочу сохранить эти данные в массиве в bash

declare -a my_array =`sqlplus -s "$SqlString"<<eof
set trimout on feedback off verify off heading off echo off;
SELECT RCRD_ID FROM ACCNT_DTLS WHERE EVNT_ID='$Event' ORDER BY LPAD(RCRD_ID, (SELECT MAX(LENGTH(RCRD_ID)) FROM ACCNT_DTLS)) ASC;
EXIT;
eof`

Примечание. Выше данных RCRD_ID - результат этого запроса

SELECT RCRD_ID FROM ACCNT_DTLS WHERE EVNT_ID='$Event' ORDER BY LPAD(RCRD_ID, (SELECT MAX(LENGTH(RCRD_ID)) FROM ACCNT_DTLS)) ASC;

, но когда я печатаю длину my_array, в результате всегда возвращается 1

, я хочу напечатать Приведенные выше данные в формате XML

#loop start

    echo "<RCRD_ID>$RCRD_ID</RCRD_ID>"      
    echo "<ACCOUNT>$ACCOUNT</ACCOUNT>"

#loop end

Пример -

<RCRD_ID>630566DAD135E9A11</RCRD_ID>
<ACCOUNT>JZZ35</ACCOUNT>

Я попытался создать массив и попытался передать RCRD_ID для получения ACCOUNT f rom ACCNT_DTLS в SQL запрос

Пожалуйста, помогите мне оптимизировать способ динамического l oop и создать скрипт bash для получения данных из базы данных и распечатать все 11 строк для генерации XML

Ответы [ 2 ]

0 голосов
/ 03 мая 2020

Ключевой момент - массив = ($ (команда)).
Я написал пример. Я надеюсь это тебе поможет.

xml_str=''
first_column=true
res=($(sqlplus -s "$SqlString"<<eof
set trimout on feedback off verify off heading off echo off;
SELECT RCRD_ID FROM ACCNT_DTLS WHERE EVNT_ID='$Event' ORDER BY LPAD(RCRD_ID, (SELECT MAX(LENGTH(RCRD_ID)) FROM ACCNT_DTLS)) ASC;
EXIT;
eof))
for item in ${res[@]};do
        if ${first_column};then
                xml_str+="<RCRD_ID>$item</RCRD_ID>\n"
                first_column=false
        else
                xml_str+="<ACCOUNT>$item</ACCOUNT>\n"
                first_column=true
        fi
done
echo -e ${xml_str}
0 голосов
/ 03 мая 2020

У меня нет вашей базы данных, поэтому я поместил ваш запрос в файл с именем output.txt, и это, кажется, работает:

#!/bin/bash

declare -a my_array=( $(cat output.txt) )

for ((i=3; i < ${#my_array[@]}; i+=3)); do
    RCRD_ID=${my_array[i]}
    ACCOUNT=${my_array[i+2]}
    printf "<RCRD_ID>%s</RCRD_ID>\n<ACCOUNT>%s</ACCOUNT>\n" "$RCRD_ID" "$ACCOUNT"
done

Вывод:

<RCRD_ID>630566DAD135E9A11</RCRD_ID>
<ACCOUNT>JZZ35</ACCOUNT>
<RCRD_ID>630566DAD135E9A12</RCRD_ID>
<ACCOUNT>EGC46</ACCOUNT>
<RCRD_ID>630566DAD135E9A13</RCRD_ID>
<ACCOUNT>85955</ACCOUNT>
<RCRD_ID>630566DAD135E9A14</RCRD_ID>
<ACCOUNT>EGC36</ACCOUNT>
<RCRD_ID>630566DAD135E9A15</RCRD_ID>
<ACCOUNT>85044</ACCOUNT>
<RCRD_ID>630566DAD135E9A16</RCRD_ID>
<ACCOUNT>JZZ53</ACCOUNT>
<RCRD_ID>630566DAD135E9A17</RCRD_ID>
<ACCOUNT>09686</ACCOUNT>
<RCRD_ID>630566DAD135E9A18</RCRD_ID>
<ACCOUNT>85044</ACCOUNT>
<RCRD_ID>630566DAD135E9A19</RCRD_ID>
<ACCOUNT>JZZ53</ACCOUNT>
<RCRD_ID>630566DAD135E9A110</RCRD_ID>
<ACCOUNT>09686</ACCOUNT>
<RCRD_ID>630566DAD135E9A111</RCRD_ID>
<ACCOUNT>09686</ACCOUNT>

Что вы пропустили:

Во-первых, declare -a my_array = не является синтаксисом присваивания оболочки - знак = не должен содержать окружающих пробелов.

Во-вторых, синтаксис массива равен array=( ... ), где часть ... будет выводом вашей команды оболочки, а именно $(sqlplus ...).

Если вы настаиваете на использовании синтаксиса << eof, то вы можете сделать что-то вроде:

declare -a my_array=( $(sqlplus -s "$SqlString" << eof
set trimout on feedback off verify off heading off echo off;
SELECT RCRD_ID FROM ACCNT_DTLS WHERE EVNT_ID='$Event' ORDER BY LPAD(RCRD_ID, (SELECT MAX(LENGTH(RCRD_ID)) FROM ACCNT_DTLS)) ASC;
EXIT;
eof

В-третьих, выходные данные будут представлять собой просто набор разделенных пробелами токенов, и для вашего вывода каждые 3 токена вместе представляют собой интересную единицу работы, поэтому часть i+=3. Циклы отображаются на i=3, потому что первая строка - первые 3 токена - не то, что вы хотите в выводе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...