我有一个任务,我必须比较模式中的所有列与同一列的趋势。为此,我编写了一个查询,它批量生成insert语句。insert语句的总数将超过50k+。我编写的sql生成查询如下:
select ' insert into global.PM_COUNTER_AUDIT select ''' || column_name ||
''' COUNTER_NAME, pre.country,pre.city, pre.stddev_col_name , pre.cnt_wk,post.counter_last_day,var_wk from (select country, city,stddev(nvl(' || column_name ||
',0)) stddev_col_name, variance(nvl(' || column_name || ',0)) var_wk, avg(nvl(' || column_name || ',0)) cnt_wk, count(*) from ' || owner || '.' || table_name ||
' where datetime>=trunc(sysdate)-14 and upper(trim(tO_char(datetime,''DAY''))) NOT IN (''FRIDAY'',''SATURDAY'') group by country, city)pre left outer join (select country, city,sum(nvl(' ||
column_name || ',0)) counter_last_day from ' || owner || '.' || table_name ||
' where datetime>=trunc(sysdate)-1 group by country, city )post on pre.country=post.country and pre.city=post.city where counter_last_day not between pre.cnt_wk-(3*(pre.stddev_col_name)) and pre.cnt_wk+(3*(pre.stddev_col_name)) '
from all_tab_cols
where owner = 'HUAWEI_EUTRAN_PM'
and upper(table_name) in ('TABLE_X', 'TABLE_Y', table_z)
and nullable = 'Y'
现在我想使用cursor或immediate execute执行所有这些生成的语句,但我无法完成这一点。请告诉我怎么做。
短暂性脑缺血发作
2条答案
按热度按时间oyt4ldly1#
稍微清理一下代码,您可以执行以下操作:
我去掉了一些不必要的部分,简化了日检查,同时添加了一个用于该部分的显式语言。
它将生成并运行如下语句:
... 哪里
z_stats
有一个名为 `` .db<>摆弄(用
user
而不是HEXA
所以它运行)。我拿出来的一件东西是
UPPER(TABLE_NAME)
; 只有当您的表名是大小写混合的,并且是用带引号的标识符创建的时,才需要这样做。如果它们是代码中的其他引用,则必须引用它们,因此可能是噪声。您可能需要添加一个数据类型检查,以便只选取数字列。5vf7fwbs2#
除了你的陈述很难阅读之外,它也是毫无意义的。我假设您尝试运行类似以下的过程:
这个查询没有多大意义,而且很可能pl/sql无法即时工作,但我希望您了解如何编写它。
你可以看看开窗条款。应该可以在没有子查询的情况下运行查询。cte公司。可能与此类似: