嵌套表表达式不适用于 db2 z/OS
Posted
技术标签:
【中文标题】嵌套表表达式不适用于 db2 z/OS【英文标题】:Nested Table Expression not working for db2 z/OS 【发布时间】:2021-02-17 20:13:00 【问题描述】:以下查询在 DB2 LUW 中运行时有效。
SELECT
TEMP1.SINIESTRO,
TEMP1.POLIZA
FROM TABLE(VALUES
('00000031955190','0107737793'),
('00000118659978','0107828212'),
('00000118978436','0095878120'),
('00000122944473','0106845043')
) TEMP1(SINIESTRO, POLIZA);
当我尝试在 DB2 for z/OS 中使用它时,我收到以下错误: SQL 错误 [42601]:非法符号“,”。一些可能合法的符号是:在 CARDINALITY OVER 内)。 SQLCODE=-104, SQLSTATE=42601, DRIVER=3.72.24
我也尝试过 CTE。
WITH X(foo, bar, baz) AS (
VALUES (0, 1, 2), (3, 4, 5), (6, 7, 8)
) SELECT * FROM X;
我得到了这个错误: SQL 错误 [42601]:非法符号“X”。一些可能合法的符号是:DSN_INLINE_OPT_HINT。 SQLCODE=-104, SQLSTATE=42601, DRIVER=3.72.24
知道我应该改变什么才能让它工作吗?
【问题讨论】:
VALUES 语句在 Db2-for-Z/OS 中尚不可用,因此请替换为对 sysibm.sysdummy1 或临时表的查询。 【参考方案1】:当前发布的 Db2-for-Z/OS 版本没有像其他 Db2 平台已有的 VALUES 子句。
Db2-for-Z/OS 有一个名为 sysibm.sysdummy1
的单行表,有些人使用它。
但是,如果您可以引用临时表而不是 sysibm.sysdummy1
,那么代码看起来更简洁。
在 Db2 for Z/OS 上运行语句的一种尴尬方式(存在其他方式)是使用联合 sysibm.sysdummy1 中的行的 CTE,
(如果合适,在子查询中使用union all
):
with temp1 (SINIESTRO, POLIZA)
as
(
select '00000031955190','0107737793' from sysibm.sysdummy1
union
select '00000118659978','0107828212' from sysibm.sysdummy1
union
select '00000118978436','0095878120' from sysibm.sysdummy1
union
select '00000122944473','0106845043' from sysibm.sysdummy1
)
SELECT
TEMP1.SINIESTRO,
TEMP1.POLIZA
FROM temp1;
【讨论】:
以上是关于嵌套表表达式不适用于 db2 z/OS的主要内容,如果未能解决你的问题,请参考以下文章
DB2 z/OS - 为现有表创建表别名/同义词,指向其他现有表
在 Z/OS 上的 db2 的 JDBC URL 中设置默认表空间?