![如何在SQL plus中使用“$”?](https://rvso.com/image/1476398/%E5%A6%82%E4%BD%95%E5%9C%A8SQL%20plus%E4%B8%AD%E4%BD%BF%E7%94%A8%E2%80%9C%24%E2%80%9D%EF%BC%9F.png)
我面臨以下問題。
當我嘗試在 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
延伸閱讀: