【问题标题】:How to use single quotes in sqlplus select string in Unix shell script如何在 Unix shell 脚本中的 sqlplus 选择字符串中使用单引号
【发布时间】:2017-07-06 01:52:28
【问题描述】:

我知道这是一个经常讨论的话题,但我尝试了其他帖子中的所有答案都无济于事,所以我最终决定发布我的情况。

在我的脚本中:

failures=$(sqlplus -s << EOF
${SQLIN}
set heading off;
WHENEVER OSERROR EXIT 9;
WHENEVER SQLERROR EXIT SQL.SQLCODE;
select failures from dba_jobs where what like dbms_refresh.refresh%;
EOF
)

dbms_refresh.refresh% 是我需要在单引号中捕获的内容,但是,我知道仅使用单引号本身是不够的。我不完全理解 unix 和 oracle 如何在选择命令中翻译单引号。

我尝试了以下方法,但没有成功:

谁能给我解释一下 unix 和 oracle 是如何相互交谈的,这决定了如何在选择查询中读取单引号?

编辑:如果我使用'dbms_refresh.refresh%',下面是我的结果

select failures from dba_jobs where what like "dbms_refresh.refresh%" check_mview_test.sh check_mview_test_v1.ksh check_mview_test_v1.sh get_pageid_test.sh ERROR at line 1: ORA-00904: "dbms_refresh.refresh%": invalid identifier

【问题讨论】:

  • 为什么你认为单独使用单引号是不够的?在 bash(和变体)中使用 where what like 'dbms_refresh.refresh%'; 对我来说效果很好。只使用单引号会出现什么错误?
  • 你试过不使用反斜杠吗?我可以轻松执行你的命令。
  • 嗯,这很有趣。我正在使用 korn shell。我将尝试在 bash 中执行。我会用我的错误更新我的问题。
  • 根据错误,您的编辑使用双引号,而不是单引号。我对 ksh 中的单引号也没有问题;但可能是版本问题(如果您确实收到错误) - ksh --version 告诉您什么?
  • 看到这就是我的困惑。 y 脚本使用单引号,但错误返回显示双引号。 ksh --version 返回--version: bad option(s),抱歉,不知道如何为您获得更好的输出

标签: oracle shell unix sqlplus


【解决方案1】:

似乎可以工作,虽然不完全是在“SQLPLUS”上,但我在我的 postgres 上尝试过。

这是脚本:

=>|Fri Feb 17|01:23:36|postgres@[STATION]:/var/lib/pgsql> cat test.sh
#!/bin/bash
mytable="$1"
failures=$(psql <<EOF
select phonenumber from $mytable where phonenumber like '91%' ;
EOF
)
echo "==========RESULT==========="
echo $failures
echo "============END============"

=>|Fri Feb 17|01:23:39|postgres@[STATION]:/var/lib/pgsql>

输出:

=>|Fri Feb 17|01:24:12|postgres@[STATION]:/var/lib/pgsql> ./test.sh mdn_2
==========RESULT===========
phonenumber -------------- 919821217792 (1 row)
============END============

=>|Fri Feb 17|01:24:14|postgres@[STATION]:/var/lib/pgsql>

希望这会有所帮助。让我们知道。谢谢。

【讨论】:

    【解决方案2】:

    您所展示的内容适用于 ksh93 中的普通单引号,但 ksh88 似乎正在将单引号更改为命令替换内的双引号,或者可能在 heredoc 内。这就是为什么在您的编辑中,带有单引号的 yoru 查询会报告显示(双)引号标识符的错误。

    通过一些实验,您可以通过将分配从 $(...) 更改为反引号来避免这种情况:

    failures=`sqlplus -s << EOF
    ${SQLIN}
    set heading off;
    WHENEVER OSERROR EXIT 9;
    WHENEVER SQLERROR EXIT SQL.SQLCODE;
    select failures from dba_jobs where what like 'dbms_refresh.refresh%';
    EOF
    `
    

    或者你可以将字符串放入它自己的shell变量中,这似乎也可以避免它;但这并不能真正扩展到更复杂的查询:

    VALUE="'dbms_refresh.refresh%'"
    
    failures=$(sqlplus -s << EOF
    ${SQLIN}
    set heading off;
    WHENEVER OSERROR EXIT 9;
    WHENEVER SQLERROR EXIT SQL.SQLCODE;
    select failures from dba_jobs where what like ${VALUE};
    EOF
    )
    

    【讨论】:

    • 当然,在意识到这是一个 ksh 版本问题后,我应该研究一下,而不是试图找到解决方法...it seems to be a well-known issue with heredocs in ksh88。我想我什至可能从多年前就认出它——迟到总比没有好。
    • 太好了,非常感谢。我尝试用反引号替换$(...),它起作用了。我想我会考虑升级我们的版本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    • 2015-05-05
    • 2019-12-29
    • 2020-03-08
    • 1970-01-01
    • 2015-07-08
    相关资源
    最近更新 更多