$ игнорируется при попытке выполнить запрос - PullRequest
0 голосов
/ 10 февраля 2020

Я использую следующую команду Oracle, чтобы узнать режим ведения журнала базы данных Oracle:

select name,log_mode from v$database

Эта команда без проблем выполняется из интерактивного сеанса:

SQL> select name,log_mode from v$database;

NAME      LOG_MODE
--------- ------------
T2       NOARCHIVELOG

Но не удалось правильно запустить при запуске из сценария:

#!/bin/sh
export ORACLE_HOME=/oracle/app/oracle/product/12.1.0/dbhome_1;export ORACLE_SID=T2;/oracle/app/oracle/product/12.1.0/dbhome_1/bin/sqlplus -L -s "user/password" <<EOF
select name,log_mode from v$database;
quit
EOF 

Со следующим сообщением об ошибке:

ERROR at line 1:
ORA-00942: table or view does not exist

При проверке stdout я вижу, что остальные команда после знака $ игнорируется:

StdOut = select name,log_mode from v
                          *
ERROR at line 1:
ORA-00942: table or view does not exist

Я пробовал несколько способов обработки проблемного знака c $, используя: "", '', "\ Но пока никто из них не поможет. моя последняя попытка выглядит следующим образом:

#!/bin/sh
export ORACLE_HOME=/oracle/app/oracle/product/12.1.0/dbhome_1;export ORACLE_SID=T2;/oracle/app/oracle/product/12.1.0/dbhome_1/bin/sqlplus -L -s "user/password" <<EOF
select name,log_mode from v'$'database;
quit
EOF

Но теперь Stdout с одинарными кавычками:

    StdOut = select name,log_mode from v'$'database
                           *
ERROR at line 1:
ORA-00933: SQL command not properly ended

Стоит отметить, что используемая учетная запись имеет SELECT ANY DICTIONARY привилегия и роль SELECT_CATALOG_ROLE.

Ответы [ 2 ]

2 голосов
/ 10 февраля 2020

$ интерпретируется вашей оболочкой до того, как Oracle увидит его; она заменяет $database, который не определен. Это не имеет ничего общего с Oracle - это просто то, как работают оболочки.

Вам нужно экранировать знак $, как вы уже поняли; Вы сказали, что пытались \$, но это то, что вам нужно:

select name,log_mode from v\$database;

Итак:

#!/bin/sh
export ORACLE_HOME=/oracle/app/oracle/product/12.1.0/dbhome_1;export ORACLE_SID=T2;/oracle/app/oracle/product/12.1.0/dbhome_1/bin/sqlplus -L -s "user/password" <<EOF
select name,log_mode from v\$database;
quit
EOF

, который работает.

1 голос
/ 10 февраля 2020

Попробуйте <<'EOF' вместо <<EOF, чтобы избежать замены оболочки во входных данных («здесь-документ»), см.
https://mywiki.wooledge.org/HereDocument или
https://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_07_04

#!/bin/sh
export ORACLE_HOME=/oracle/app/oracle/product/12.1.0/dbhome_1
export ORACLE_SID=T2
/oracle/app/oracle/product/12.1.0/dbhome_1/bin/sqlplus -L -s "user/password" <<'EOF'
select name,log_mode from v$database;
quit
EOF 
...