【问题标题】:Refer to table name dynamically in DB2/400 SQL query..?在 DB2/400 SQL 查询中动态引用表名..?
【发布时间】:2018-11-07 20:00:31
【问题描述】:

我想运行一个查询,获取实时数据和元数据的组合,以获得定期更改的表名列表。这是用于在具有 100 多个模式和数千个表/视图的大型服务器上进行研究和分析。我需要帮助动态引用表名,我明白这是不可能的。不过……

我的谷歌搜索表明解决方案可能是文本变量中的 SQL 语句,然后由 EXEC 语句执行。但这是 DB2/400 v7r3,它是一个复杂的东西(就像它在 IBM 网站上的 SQL 参考一样),我很难创建正确的语法。

这是我想做的一个基本示例,但它当然不起作用:

SELECT        TABLE_NAME,
              TABLE_TEXT,
              ( SELECT COUNT(*) FROM TABLE_NAME ) AS ROW_COUNT
              -- above line of course does not work
FROM          QSYS2.SYSTABLES
WHERE         TABLE_SCHEMA = 'ABCDEFGH'
AND           TABLE_NAME IN ('ARCMNTST', 'ARIMSGT', 'ARTENT', 'DAILYHT', 'ETC')

我知道我需要类似以下内容,但我无法找出正确的陈述:

DECLARE       @sqltext AS VARCHAR(128)
SELECT        TABLE_NAME,
              TABLE_TEXT,
              ( SET @sqltext = 'SELECT COUNT(*) FROM ABCDEFGH.' || TABLE_NAME
                EXEC sqltest ) AS ROW_COUNT --this is probably wrong
FROM          QSYS2.SYSTABLES
WHERE         TABLE_SCHEMA = 'ABCDEFGH'
AND           TABLE_NAME IN ('ARCMNTST', 'ARIMSGT', 'ARTENT', 'ETC', 'ETC', 'ETC')
ORDER BY      TABLE_NAME

【问题讨论】:

    标签: db2 db2-400 db2-luw


    【解决方案1】:

    动态 SQL 并不难...

    基本上,将您的 SQL 语句构建到您的字符串变量中。使用CONCAT 包含来自其他的值

    @sqlStmt = 'Insert into mytable values (''ConstVal'',' concat SomeVar concat ')';
    
    execute immediate @sqlStmt;
    

    问题是你必须转义字符串,比如上面的'ConstVal'用双单引号。

    另一个问题是您不能像尝试那样使用SELECT。如果您只有一行要返回,SELECT INTO 将是静态语句的一个选项。但不支持动态。您必须改用动态VALUES INTO

    但是,您似乎想要返回多行。在这种情况下,您需要使用游标。不幸的是,动态游标有点复杂,因为您必须使用 SQL 描述符。

    declare myCursor cursor for myStatement;
    
    set @sqlStmt = 'select ....';
    prepare myStatement into mySqlDescriptor from @SqlStmt;
    
    open myCursor;
    // done if you are returning the results
    // assuming you want to process in your procedure..
    // add a loop that does 
    //   fetch next from myCursor into myData;
    

    说了这么多,您不需要任何它来获取表的行数...syspartitionstat 目录视图已经包含该信息。

    select table_name, number_rows 
    from syspartitionstat
    where table_schema = 'ABCDEFGH' 
          and TABLE_NAME in ('ARCMNTST', 'ARIMSGT', 'ARTENT', 'ETC', 'ETC', 'ETC');
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-17
      • 1970-01-01
      • 1970-01-01
      • 2021-08-26
      • 1970-01-01
      • 2014-01-07
      • 2023-04-05
      • 1970-01-01
      相关资源
      最近更新 更多