$ 尝试执行查询时被忽略
$ 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
我使用以下 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