Я столкнулся со следующей проблемой.
Когда я пытаюсь выполнить следующую команду в sqlplus в моем SLES:
sqlplus -S user/[email protected] <<EOF
SELECT INSTANCE_NUMBER, HOST_NAME, STARTUP_TIME, STATUS, DATABASE_STATUS, BLOCKED
FROM GV$INSTANCE;
EOF
он показывает мне следующую ошибку:
SQL> SELECT INSTANCE_NUMBER, HOST_NAME, STARTUP_TIME, STATUS, DATABASE_STATUS, BLOCKED FROM GVINSTANCE
*
ERROR at line 1:
ORA-00942: table or view does not exist
Полагаю, это потому, что в запросе присутствует «$», но я не уверен.
Есть ли способ запустить эту команду в клиенте sqlplus, используя Linux в качестве ОС?
Если я делаю что-то неправильно, пожалуйста, укажите мне правильное направление.
Подробности об окружающей среде.
- ОС = SuSE Linux Enterprise Server 11 SP3
- Oracle Instant Client = Выпуск 12.1.0.2.0
- SQLPLUS = SQL*Plus: Выпуск 12.1.0.2.0
решение1
По крайней мере одна проблема заключается в синтаксисе вашей оболочки:
sqlplus -S user/[email protected] <<EOF
SELECT INSTANCE_NUMBER, HOST_NAME, STARTUP_TIME, STATUS, DATABASE_STATUS, BLOCKED
FROM GV$INSTANCE;
EOF
Это называется «здесь-документ», ипеременные оболочки(имена с префиксом $
) обычно расширяются. Чтобы предотвратить расширение,цитироватьпервое использование EOF
, например,
sqlplus -S user/[email protected] <<"EOF"
SELECT INSTANCE_NUMBER, HOST_NAME, STARTUP_TIME, STATUS, DATABASE_STATUS, BLOCKED
FROM GV$INSTANCE;
EOF
Другой проблемой может быть специальный символ в имени таблицы. Вы также можете заключить его в кавычки (сообщив Oracle игнорировать некоторые правила синтаксиса, которые он использует для SQL). Улучшение будет выглядеть так:
sqlplus -S user/[email protected] <<"EOF"
SELECT INSTANCE_NUMBER, HOST_NAME, STARTUP_TIME, STATUS, DATABASE_STATUS, BLOCKED
FROM "GV$INSTANCE";
EOF
Дальнейшее чтение: