Using dynamic table name in db2

后端 未结 1 757
感情败类
感情败类 2021-01-28 08:58

Currently in my project development need of generating the record count based on certain criteria where the table names are stored in separate table.For instance say xx table st

相关标签:
1条回答
  • 2021-01-28 09:41

    This line is not correct:

    SET COUNTVal =   'SELECT COUNT(*)  FROM  ' ||  FILEGROUPMEM || '  WHERE ICLS=  '  || CLASS  || '  AND  IVEN=  ' || VENDOR  || ' AND ISTY=  ' || STYLE || '  AND ICLR= ' || COLOR || ' AND ISIZ=  ' || SIZE   ; 
    

    To use it the way you are trying, you'd have to use a static SQL statement like so

    exec sql SELECT COUNT(*) INTO :COUNTVal  
      FROM  MYTBL 
     WHERE ICLS=  :CLASS  AND  IVEN=  :VENDOR  AND ISTY=  :STYLE 
           AND ICLR= :COLOR  AND ISIZ=  :SIZE;
    

    However, while a static statement can use variables, the table name in the FROM clause can not be variable.

    Thus you have to prepare and use a dynamic statement. Unfortunately, SELECT INTO can not be used in a dynamic statement. VALUES INTO can be used dynamically.

    set wSqlStmt = 'VALUES ( SELECT COUNT(*)  FROM  ' ||  FILEGROUPMEM 
                    || '  WHERE ICLS=  '  || CLASS  || '  AND  IVEN=  ' 
                    || VENDOR  || ' AND ISTY=  ' || STYLE || '  AND ICLR= ' 
                    || COLOR || ' AND ISIZ=  ' || SIZE ||') INTO ?';
    
    exec sql PREPARE S1 FROM :wSqlStmt;
    
    exec sql EXECUTE S1 USING COUNTVal;
    

    WARNING the above code could be subject to SQL Injection attacks. To protect against SQL injection, dynamic SQL should use parameter markers instead of concatenating input directly to a statement. While you can't use a parameter marker for the table name, you can for the rest of the variables like so:

    set wSqlStmt = 'VALUES ( SELECT COUNT(*)  FROM  ' ||  FILEGROUPMEM 
                    || '  WHERE ICLS=  ?  AND  IVEN=  ? ' 
                    || '  AND ISTY= ? AND ICLR= ?' 
                    || '  AND ISIZ= ?) INTO ?';
    
    exec SQL PREPARE S1 FROM :wSqlStmt;
    
    exec SQL EXECUTE S1 USING :CLASS, :VENDOR, :STYLE, :COLOR, :SIZE, :COUNTVal;
    
    0 讨论(0)
提交回复
热议问题