DB2 zOS:XMLQUERY具有长名称空间和窄编辑器

brc7rcf0  于 2022-11-07  发布在  DB2
关注(0)|答案(2)|浏览(121)

这听起来像是一个愚蠢的问题,现在。不幸的是,一些用途仍然必须科普技术,从上个千年。
如何在只有70个字符宽的编辑器中使用declare namespaceurn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:100这样的名称空间?
基本上我想跑:

SELECT
    xmlcast(
    XMLQUERY('declare namespace ram="urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:100";
            $e//ram:GrandTotalAmount'
            PASSING XMLPARSE(DOCUMENT xmlcol) AS "e"
    ) AS integer)
FROM
    mytable

但是名称空间声明对于只有70个字符宽的编辑器来说太长了。
到目前为止,我还没有找到使用' || <newline> '将声明分成多行的方法,但任何concat都会导致SQL Error [42601]: ILLEGAL USE OF KEYWORD PASSING

p5cysglq

p5cysglq1#

这取决于你用来执行这些语句的程序。对于标准的DSNTEP 2/SPUFI,你只需要编写到第72列,然后继续编写到第1列,如下所示(注意,列编号行不是文件的一部分,它只是使用COLS显示的行):

//SYSTSIN  DD *                                                         
  DSN SYSTEM(DB2T)                                                      
   RUN PROGRAM(DSNTEP2)    -                                            
       PLAN   (DSNTEP2)                                                 
  END                                                                   
//*                                                                     
//SYSIN    DD *                                                         
----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
   SELECT * FROM SOMEDATA.PLAN_TABLE WHERE EXPLAIN_TIME BETWEEN '2019-12
-13-00.00.00.000000' AND '2019-12-15-00.00.00.000000'                   
   FETCH FIRST 500 ROWS ONLY;                
/*

我认为连接查询表达式应该可以工作,但是IBM似乎不允许在这里使用表达式。(例如路径中的/之后),但在其他路径中则不会。如果您无法#t找到这样的位置(通过实验),你将不得不求助于上面的“第72列-〉第1列”战术。

1l5u6lss

1l5u6lss2#

非常感谢@data_henrik的评论,事情真的就这么简单:

SELECT
    xmlcast(
    XMLQUERY('$e//*:GrandTotalAmount'
            PASSING XMLPARSE(DOCUMENT xmlcol) AS "e"
    ) AS integer)
FROM
    mytable

这太好了,因为XML文件中有六个名称空间,我实际上必须declare才能获得我需要的所有其他元素/属性。

相关问题