我面临以下问题。
当我尝试在 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 Instant Client = 版本 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
这被称为“此处文档”,并且shell 变量(以 为前缀的名称$
)通常会被扩展。为了防止扩展,引用第一次使用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
进一步阅读: