如何在SQL plus中使用“$”?

如何在SQL plus中使用“$”?

我面臨以下問題。

當我嘗試在 SLES 中的 sqlplus 中執行以下命令時:

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

我想這是因為查詢中涉及“$”,但我不確定。

有沒有辦法在使用 Linux 作為作業系統的 sqlplus 用戶端中執行該指令?

如果我做錯了什麼,請指出我正確的方向。


環境細節。

  • 作業系統 = SuSE Linux Enterprise Server 11 SP3
  • Oracle 即時用戶端 = 版本 12.1.0.2.0
  • SQLPLUS = SQL*Plus:版本 12.1.0.2.0

答案1

至少有一個問題是你的 shell 語法:

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

延伸閱讀:

相關內容