Я сталкиваюсь со следующей проблемой.

Когда я пытаюсь выполнить следующую команду в sqlplus в моем SLES:

sqlplus -S user/password@balancer.domain.cl <<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 ответ1

1

По крайней мере, одна проблема - это синтаксис вашей оболочки:

sqlplus -S user/password@balancer.domain.cl <<EOF
SELECT INSTANCE_NUMBER, HOST_NAME, STARTUP_TIME, STATUS, DATABASE_STATUS, BLOCKED 
FROM GV$INSTANCE;
EOF

Это называется «здесь-документ», и переменные оболочки (имена с префиксом $) обычно расширяются. Чтобы предотвратить расширение, процитируйте первое использование EOF , например,

sqlplus -S user/password@balancer.domain.cl <<"EOF"
SELECT INSTANCE_NUMBER, HOST_NAME, STARTUP_TIME, STATUS, DATABASE_STATUS, BLOCKED 
FROM GV$INSTANCE;
EOF

Другой проблемой может быть специальный символ в имени таблицы. Вы также можете процитировать это (указав Oracle игнорировать некоторые правила синтаксиса, которые он использует для SQL). Улучшение будет выглядеть так:

sqlplus -S user/password@balancer.domain.cl <<"EOF"
SELECT INSTANCE_NUMBER, HOST_NAME, STARTUP_TIME, STATUS, DATABASE_STATUS, BLOCKED 
FROM "GV$INSTANCE";
EOF

Дальнейшее чтение:

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .