如何' IN'在db2 sql查询中工作?

时间:2017-11-29 18:25:06

标签: sql db2 mainframe

我的要求是从DB2表中选择数据,其中电话号码等于16组电话号码。我试图在本地测试数据上运行此查询,我的程序成功运行! 但是,当我尝试在真实表(备份表)上运行相同的程序时,我的RUN jcl在S722异常终止时失败。

我觉得它不是空间异常,因为我们使用的文件属性为7个柱面(1个主要,6个次要)。根据我的研究,我发现sql查询带有' IN,' LIKE'需要花费太多时间来将Jobcard中的Time参数更改为NOLIMIT。但是noluck !!

有人可以用其他任何方式编写此查询吗?或帮我纠正这个问题......

像这样查询:

EXEC SQL
DECLARE WS-CURSOR CURSOR WITH HOLD FOR
SELECT CUST_ID,CUST_NAME,SEQ_NUM,PHONE_NUM FROM PHONE_TAB 
  WHERE PHONE_NUM IN ('123456789','789456123','456789123','789456123' etc) AND
        PHONE_TYPE = 'DU' 
END-EXEC.

提前致谢!!

2 个答案:

答案 0 :(得分:2)

Sx22系列异常终止表明超出了一些系统定义的参数。例如,S322通常表示您已超过作业卡或作业步骤中TIME参数中的CPU时间量。

S722异常终止表示您生成的线轴输出多于商店JES参数允许的输出。您需要确定该假脱机输出的来源以解决异常终止。

您可能有核心转储(CEEDUMP),已编码的调试输出(SYSOUT或SYSPRINT或STDOUT或STDERR),或者您已编码的失控报告DD。线轴中的JESMSGLG DD可以在SDSF的输出顶部显示,也可以通过选择'?'可以将之前的错误报告给S722。

也许您正在遇到一个导致 S722的S322。这是完全可能的,因为大量数据会出现问题。

将时间参数设置为NOLIMIT是一种昂贵的调试技术,因为大多数大型机商店都有适当的退款算法,通常是CPU时间=某人预算中的金钱。您的商店可能有一个JES出口,可以替代NOLIMIT的其他一些值,以防止其被使用。

如user6542823所示,你可以添加一个JOBPARM LINES = some-large-number来绕过S722,但是你仍然需要解决潜在的问题。

z / OS会尝试为您提供尽可能多的信息来进行调试。利用它给你的东西。

鉴于......

  • 您说过您的程序使用本地测试数据执行正常
  • 在针对生产规模数据的备份运行时出现问题

...然后 if ...

  • 本地测试数据中表PHONE_TAB的定义与备份和生产数据中的表相匹配
  • 您的计划成功绑定
  • 您有权阅读备份数据

......问题可能不在于您的SQL,而是与数据量有关。

查看您的包的EXPLAIN输出,您可能会看到您正在扫描整个PHONE_TAB表。也许生产中存在一个索引,在您正在测试的备份中不存在。

答案 1 :(得分:0)

这是一个内联表连接,而不是在where子句中执行

IRL我会将值放入临时表并加入临时表。但是,例如我已经在线完成了这项工作。

tmp <- data.frame(x = 1:5, y = rnorm(5),
color = c("#00FF00", "#FF0000", "#00FF00", "#ffa500", "#FF0000"))

highchart() %>%
  hc_add_series(data= tmp, hcaes(x = x, y = y, color = color), type = "line")

两个表查询可能最难说,但对我来说,维护两个表肯定比每次运行时创建SQL语句的程序更容易。

SELECT CUST_ID,CUST_NAME,SEQ_NUM,PHONE_NUM FROM PHONE_TAB

join (
values('123456789'),('789456123'),('456789123'),('789456123')
) as b (ph) on phone_num = ph

where PHONE_TYPE = DU