循环遍历多个表以执行相同的查询

时间:2011-03-16 14:27:15

标签: sql loops plsql

我有一个数据库,其中每天都会创建一个表来记录流程实例。 表格标记为MESSAGE_LOG_YYYYMMDD

目前我想对所有这些表依次执行相同的QUERY。 我在下面编写了PL / SQL,但是在第10行陷入困境。如何针对所有表成功执行SQL语句?

DECLARE
  CURSOR all_tables IS
    SELECT table_name
            FROM all_tables 
            WHERE TABLE_NAME like 'MESSAGE_LOG_2%' 
            ORDER BY TABLE_NAME ;

BEGIN
  FOR msglog IN all_tables LOOP
    SELECT count(*) FROM TABLE msglog.TABLE_NAME ;
  END LOOP;
END;
/

4 个答案:

答案 0 :(得分:3)

最好将表重新构建为一个表,其中一天是关键列,而不是单个表。

话虽如此,您可以使用Dynamic SQL:

DECLARE
  CURSOR all_tables IS
    SELECT table_name
            FROM all_tables 
            WHERE TABLE_NAME like 'MESSAGE_LOG_2%' 
            ORDER BY TABLE_NAME ;

  row_count pls_integer;
BEGIN
  FOR msglog IN all_tables LOOP
    EXECUTE IMMEDIATE "SELECT COUNT(*) FROM " || msglog.TABLE_NAME INTO row_count;
  END LOOP;
END;
/

答案 1 :(得分:1)

http://download.oracle.com/docs/cd/B10500_01/appdev.920/a96590/adg09dyn.htm

基本上,在循环内部,构建一个表示要运行的查询的字符串,并使用动态SQL来运行查询。

要做任何有用的事情,您可能想要将记录插入临时表,然后选择按日期降序排序。

答案 2 :(得分:0)

将执行立即与批量收集用于http://www.adp-gmbh.ch/ora/plsql/bc/execute_immediate.html。将表连接到union all,Oracle将识别union all以使用并行查询http://www.dba-oracle.com/art_opq1.htm

答案 3 :(得分:0)

也许您应该将所有日志放入一个日志表中,添加一两列来区分不同的日期(created_date或created_timestamp列可能,+您希望的任何其他标识符)。如果需要,您甚至可以设置分区。通过为每天日志创建一个新表,每天跟踪日志似乎是一种奇怪(而且杂乱)的方式。