我有一个数据库,其中每天都会创建一个表来记录流程实例。 表格标记为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;
/
答案 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列可能,+您希望的任何其他标识符)。如果需要,您甚至可以设置分区。通过为每天日志创建一个新表,每天跟踪日志似乎是一种奇怪(而且杂乱)的方式。