【问题标题】:IIB: Passing local variable to ESQL select statementIIB:将局部变量传递给 ESQL 选择语句
【发布时间】:2017-07-25 12:16:51
【问题描述】:

我需要根据 IIB/WMB 的输入 xml 中给出的 Job 代码从两个表中检索数据。

SQL 查询

SELECT D.DEPTNO,D.DNAME,D.LOC,E.EMPNO,E.ENAME,E.JOB,E.SAL FROM DEPT D JOIN EMP E on E.JOB ='MANAGER' OR E.JOB = 'CLERK'

ESQL 查询

从输入 xml 中获取 JOB 详细信息并将其分配给局部变量。

SET type1 = InputRoot.XMLNSC.Employee.Type[1];
SET type2 = InputRoot.XMLNSC.Employee.Type[2];

现在我需要将上述变量传递给我的 ESQL 查询。

SET Outputroot.XMLNSC.List[] = PASSTHRU('SELECT D.DEPTNO,D.DNAME,D.LOC,E.EMPNO,E.ENAME,E.JOB,E.SAL FROM Database.EMP AS E,Database.DEPT AS D where E.JOB =?' VALUES('type1','type2')) ;

但是上面的查询不起作用。

【问题讨论】:

    标签: ibm-integration-bus extended-sql


    【解决方案1】:

    这个查询有两个问题:

    首先,您传递了两个参数,但查询中只存在一个问号 (?)。

    其次,你要传递一个像'type1'这样的字符串值,正确的是传递变量:

    SET Outputroot.XMLNSC.List[] = PASSTHRU('SELECT D.DEPTNO,D.DNAME,D.LOC,E.EMPNO,E.ENAME,E.JOB,E.SAL FROM Database.EMP AS E,Database.DEPT AS D where E.JOB =?' VALUES(type1)) ;
    

    【讨论】:

    • 谢谢拉斐尔。但是上面的查询也不起作用。我收到以下异常“SQL 命令未正确结束”。
    • 您不需要在 PASSTHRU 中的表名前加上 Database 关键字。顺便说一句,你真的想要一个笛卡尔加入吗?考虑到您的表和列的名称,这似乎不太实用。当我们在做的时候,为什么你甚至需要一个PASSTHRU?您的查询也应该在 esql 选择中工作。
    • 阿提拉是正确的。数据库必须在 passthru 查询中传递。数据库只能在本机 SELECT ESQL 语法中使用。
    • 感谢您的意见。你们是对的,数据库关键字不应该在 passthru 语句中使用。
    【解决方案2】:

    解决办法如下:

        DECLARE designation char;
           DECLARE designation1 char;
           DECLARE Query char;
    
    
    
          FOR source AS InputRoot.XMLNSC.Employees.Designation[]  DO
                    IF(source = '') THEN
                        SET designation = 'Empty';
                    ELSE        
                        SET designation = designation1 ||''''||UPPER(source)||'''';                     
                    SET designation1 = ''''||UPPER(source)||''''||','||designation1 ;
    
                END IF;      
    
    
    SET Query = '(SELECT D.DEPTNO,D.DNAME,D.LOC,E.EMPNO,E.ENAME,E.JOB,E.SAL FROM EMP AS E JOIN DEPT AS D on D.DEPTNO = E.DEPTNO where E.JOB in ('||designation||'))';
    
    SET Outputroot.XMLNSC.List[] = PASSTHRU(Query);
    

    【讨论】:

    • 我知道创建指定(CLERK,MANAGER) 的语句是多余的。我需要这方面的建议。
    【解决方案3】:

    passthru 调用应该是

    SET Outputroot.XMLNSC.List[] = PASSTHRU('SELECT D.DEPTNO,D.DNAME,D.LOC,E.EMPNO,E.ENAME,E.JOB,E.SAL FROM Database.EMP AS E,Database.DEPT AS D where E.JOB in (? , ?)', type1,type2) ;
    

    SET Outputroot.XMLNSC.List[] = PASSTHRU('SELECT D.DEPTNO,D.DNAME,D.LOC,E.EMPNO,E.ENAME,E.JOB,E.SAL FROM Database.EMP AS E,Database.DEPT AS D where E.JOB=? or E.JOB=?)', type1,type2) ;
    

    【讨论】:

      【解决方案4】:

      在您的 PASSTHRU 语句后添加 To Database.DBName,其中 DBName 是您的数据库名称

      像这样:

      SET Outputroot.XMLNSC.List[] = PASSTHRU('SELECT D.DEPTNO,D.DNAME,D.LOC,E.EMPNO,E.ENAME,E.JOB,E.SAL FROM Database.EMP AS E,Database.DEPT AS D where E.JOB =?' VALUES(type1)) To Database.DBName ;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-07
        • 2023-03-25
        • 2011-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多