【问题标题】:What is the reason for inconsistent behavior of sql query in shell script?shell脚本中sql查询行为不一致的原因是什么?
【发布时间】:2015-12-06 13:03:43
【问题描述】:

我有一个查询数据库并返回计数的 shell 脚本。下面是代码。查询返回错误的结果。但是当我在一些 sql 客户端(SQL 工具和 SQL 开发人员)中运行时,结果符合预期。shell 脚本中相同查询的行为不一致的实际原因是什么?预期结果为零,但在 shell 脚本中返回的值为 4。这应该是 select count(*) FROM schema1.emp WHERE batch_num in ('1000' ,'1001','1002') 的结果。当我通过 shell 脚本运行时,不知何故缺少 where 条件的第二部分。

#!/bin/ksh
run_query() {
    (
        "$SQLPLUS" -SILENT /NOLOG @/dev/stdin <<EndOfSQL
                WHENEVER OSERROR EXIT FAILURE
                WHENEVER SQLERROR EXIT FAILURE

                CONNECT $USER/$PWD@$MY_SID
                SET SERVEROUTPUT OFF;
                SET TERMOUT OFF
                SET TRIMSPOOL ON
                SET PAGESIZE 0
                SET LINESIZE 32767
                SET FEEDBACK OFF
                SET VERIFY OFF
                SET TAB OFF
                SPOOL /dev/stderr
                $1
                SPOOL OFF
EndOfSQL
    ) 3<&1 1<&2 2<&3 3<&-
}

rec_count=$(run_query " select count(*) FROM schema1.emp WHERE batch_num in ('1000' ,'1001','1002') AND stat NOT IN ('NEW','DUPLICATE');")



echo $rec_count

提前致谢。

【问题讨论】:

  • 第二个查询只能产生零行。
  • 您的两个查询不同。您的第二个查询应返回 0 行,因为 batch_num 不能同时为 1000 1001 1002。它只能有 1 个值。
  • 哦,对不起,我犯了一个多么愚蠢的错误。谢谢你。但是你能告诉我第一个查询是否有问题吗?
  • 您实际上并没有说出 shell 脚本给您的结果,而不是您在 Toad/SQL Developer 中运行 sql 语句时得到的结果。如果您可以将该信息添加到您的问题中,将会很有帮助。
  • 再次抱歉,我已经编辑了问题。

标签: sql oracle shell sqlplus ksh


【解决方案1】:
select count(*) 
FROM schema1.emp 
WHERE batch_num in ('1000' ,'1001','1002') stat NOT IN ('NEW','DUPLICATE');

第一个查询语法不正确,根本不会执行。在stat 之前缺少一个AND 关键字。

select count(*) 
FROM schema1.emp 
WHERE batch_num = '1000' 
AND batch_num = '1001' 
AND batch_num = '1002' 
AND stat <> 'NEW' 
AND stat <> 'DUPLICATE' ;

第二个查询将总是返回零行。条件batch_num = '1000' AND batch_num = '1001' AND batch_num = '1002' 怎么可能是真的?只有当它是 IN 或使用 OR 条件扩展它时才会起作用。

【讨论】:

  • 谢谢,很抱歉,因为在编写问题时出错,但实际查询有 AND。我明白了第二个查询的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-24
  • 1970-01-01
  • 2012-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多