Как назначить оператор select из Oracle переменной оболочки

1 )Я не вижу ни одной опции вgpgпод названием --export-secret-key.

2 )Ключ, вероятно, будет иметь формат, отличный от ожидаемого ssh. Вам, скорее всего, потребуется преобразовать его в формат, понятный OpenSSH. Обновите вопрос, указав информацию о формате ключа.

1
14.08.2019, 17:26
1 ответ

Вот некоторые альтернативы, похожие на ответ тердона , которые пытаются упростить обработку вывода SQL *Плюс, учитывая, что вы пытаетесь получить его в переменную оболочки ID_VAL.

По умолчанию операторы SQL, выполняемые в SQL *Plus, создают форматированные отчеты, состоящие из столбцов, ширина которых зависит от соответствующих типов данных. Это приведет к некоторым возможным нежелательным эффектам :, например, к левым -дополненным числам, которые вы указали в комментарии .

Демонстрация:

$ DB_CONNECT="user/password@db"
$ ID_VAL="$(sqlplus -s $DB_CONNECT <<'END'
set feedback off
set head off
set pagesize 0
SELECT 123 FROM DUAL
/
END
)"
$ printf '"%s"\n' "$ID_VAL"
"       123"
$ printf '%s' "$ID_VAL" | od -An -tx1
 20 20 20 20 20 20 20 31 32 33

Некоторые альтернативы:

  1. Если вы выбираете число, преобразуйте его в строку и обрежьте в своем операторе SQL. Поскольку все остальное в приведенном выше скрипте не изменилось (, я продолжу использовать свой фиктивный оператор SELECTдля простоты тестирования ):

    .
    SELECT TRIM(TO_CHAR(123)) FROM DUAL;
    
  2. Используйте dbms_output.put_lineв блоке PL/SQL:

    ID_VAL="$(sqlplus -s $DB_CONNECT <<'END'
    set serveroutput on
    set feedback off
    DECLARE
    myvar NUMBER;
    BEGIN
    SELECT 123 INTO myvar FROM DUAL;
    dbms_output.put_line(myvar);
    END;
    /
    END
    )"
    

    Обратите внимание, что set serveroutput onявляется обязательным, в противном случае вывод не отображается.

С помощью (1 )и (2 )вы получите:

$ printf '"%s"\n' "$ID_VAL"
"123"
$ printf '%s' "$ID_VAL" | od -An -tx1
 31 32 33

Обратите внимание, однако, что эти подходы не сработают, если вы выбираете строку с пустыми символами по бокам, которые вы хотите сохранить (, например. foo ). Вы можете заключить эту строку в кавычки и удалить их впоследствии, или:

  1. Разрешить SQL *Plus форматировать выходные данные как CSV:

    ID_VAL="$(sqlplus -s -M "CSV ON" $DB_CONNECT <<'END'
    set feedback off
    set head off
    SELECT '  foo  ' FROM DUAL;
    END
    )"
    printf '"%s"\n' "$ID_VAL"
    ""  foo  ""
    

    В отличие от чисел, строки заключаются в двойные -кавычки, что требует некоторой постобработки -. Предполагая, что возвращаемое значение не содержит <newline>символов, одним из способов может быть использование sedдля удаления начального и конечного "символов (все остальное без изменений):

    ID_VAL="$(sqlplus -s -M "CSV ON" $DB_CONNECT <<'END' | sed 's/^"//; s/"$//;'
    

Лучший вариант зависит от вашего фактического варианта использования.

0
27.01.2020, 23:30

Теги

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