如何在 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 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

进一步阅读:

相关内容