$ 尝试执行查询时被忽略

$ ignored when trying to execute query

我使用以下 Oracle 命令找出 Oracle 数据库的日志记录模式:

select name,log_mode from v$database

该命令 运行ning 在交互式会话中没有任何问题:

SQL> select name,log_mode from v$database;

NAME      LOG_MODE
--------- ------------
T2       NOARCHIVELOG

但是当运行从脚本运行中正确运行时失败:

#!/bin/sh
export ORACLE_HOME=/oracle/app/oracle/product/12.1.0/dbhome_1;export ORACLE_SID=T2;/oracle/app/oracle/product/12.1.0/dbhome_1/bin/sqlplus -L -s "user/password" <<EOF
select name,log_mode from v$database;
quit
EOF 

出现以下错误信息:

ERROR at line 1:
ORA-00942: table or view does not exist

检查 stdout 时,我可以看到忽略 $ 符号后的其余命令:

StdOut = select name,log_mode from v
                          *
ERROR at line 1:
ORA-00942: table or view does not exist

我尝试了多种方法来处理有问题的 $ 标志,使用:""''"\,但其中 none 有帮助迄今为止。我最近的尝试如下:

#!/bin/sh
export ORACLE_HOME=/oracle/app/oracle/product/12.1.0/dbhome_1;export ORACLE_SID=T2;/oracle/app/oracle/product/12.1.0/dbhome_1/bin/sqlplus -L -s "user/password" <<EOF
select name,log_mode from v'$'database;
quit
EOF

但现在标准输出带有 ' 单引号:

    StdOut = select name,log_mode from v'$'database
                           *
ERROR at line 1:
ORA-00933: SQL command not properly ended

值得一提的是,我使用的帐户同时具有 SELECT ANY DICTIONARY 权限和 SELECT_CATALOG_ROLE 角色。

$ 在 Oracle 看到它之前被您的 shell 解释;她 shell 正在替换未定义的 $database。这与 Oracle 无关 - 这就是 shell 的工作方式。

如您所知,您需要转义 $ 标志;你说你试过 $,但这就是你需要的:

select name,log_mode from v$database;

所以:

#!/bin/sh
export ORACLE_HOME=/oracle/app/oracle/product/12.1.0/dbhome_1;export ORACLE_SID=T2;/oracle/app/oracle/product/12.1.0/dbhome_1/bin/sqlplus -L -s "user/password" <<EOF
select name,log_mode from v$database;
quit
EOF

有效。

尝试 <<'EOF' 而不是 <<EOF 以避免在输入数据 ("here-document") 中进行 shell 替换,参见
https://mywiki.wooledge.org/HereDocument
https://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_07_04

#!/bin/sh
export ORACLE_HOME=/oracle/app/oracle/product/12.1.0/dbhome_1
export ORACLE_SID=T2
/oracle/app/oracle/product/12.1.0/dbhome_1/bin/sqlplus -L -s "user/password" <<'EOF'
select name,log_mode from v$database;
quit
EOF