1

技术人员——即使我知道我有 2 行,其中 1 行与 000020 上的 EMPNO 匹配,而另一行在 000030 上匹配,我得到一个空结果集。有任何想法吗?

这是电话:

CALL DB2INST1.EMP_MULTIPLE_XML(XMLPARSE(
    DOCUMENT '<EMPLOYEE><EMPNO>000020</EMPNO><EMPNO>000030</EMPNO></EMPLOYEE>'));

这是更改后的存储过程:

   BEGIN

   CREATE PROCEDURE DB2INST1.EMP_MULTIPLE_XML (IN DOC XML)
   DYNAMIC RESULT SETS 1
   READS SQL DATA
   LANGUAGE SQL SPECIFIC EMP_MULTIPLE_XML

   DECLARE CSR1 CURSOR WITH RETURN FOR
    SELECT emp.EMPNO,
           emp.FIRSTNME,
           emp.LASTNAME,
           emp.WORKDEPT
     FROM DB2INST1.EMPLOYEE emp
     WHERE emp.EMPNO IN
      (SELECT X.EMPNO FROM
        XMLTABLE('$d/EMPLOYEE/EMPNO' PASSING DOC AS "d" COLUMNS EMPNO CHAR(6) PATH 'EMPNO') AS X);

 OPEN CSR1;
 END
4

2 回答 2

1

考虑到 proc 正在将结果集从过程中传递出来,这FETCH似乎没有必要。尝试删除 FETCH 及其之后的所有内容(最后的 END 除外)。

'$d/employee'调用中的参数XMLTABLE不正确,因为您希望每次出现'$d/employee/empno', 而不是'$d/employee'. 这就是导致item(), item()+错误的原因

此过程是一个独立的示例,它展示了如何实现通过 XML 文档参数传递一组输入值的目标:

CREATE OR REPLACE PROCEDURE test.INPUT_MULTIPLE_XML (IN DOC XML)
DYNAMIC RESULT SETS 1
LANGUAGE SQL
SPECIFIC INPUT_MULTIPLE_XML

BEGIN

DECLARE CSR1 CURSOR WITH RETURN FOR

  select t.type,
         t.tabschema,
         t.tabname
   from syscat.tables t,  
   XMLTABLE('$d/tables/tabname' PASSING DOC AS "d" 
            COLUMNS "TABNAME" VARCHAR(128) PATH '.'
   ) AS X
   WHERE X.tabname = t.tabname
;

  OPEN CSR1;

END
于 2012-09-09T05:03:44.017 回答
0

对于那些在我身后关注这个线程的人,这里是有效的 sproc:

  CREATE OR REPLACE PROCEDURE test.INPUT_MULTIPLE_XML (IN DOC XML) 
  DYNAMIC RESULT SETS 1  
  LANGUAGE SQL SPECIFIC INPUT_MULTIPLE_XML  
  BEGIN  
     DECLARE CSR1 CURSOR WITH RETURN FOR    
        select t.type,          
               t.tabschema,          
               t.tabname    
         from syscat.tables t,      
          XMLTABLE('$d/tables/tabname' PASSING DOC AS "d" 
          COLUMNS "TABNAME" VARCHAR(128) PATH '.'    ) AS X   
           WHERE X.tabname = t.tabname ;    

  OPEN CSR1;  
  END 
于 2012-09-12T12:27:06.777 回答