我有一个包含每日表格的数据库。我想编写一个过程,该过程将创建一个视图,以便将该月的所有表联合起来。我希望在31天或30天内捕捉数月,而FEB则追踪29天。使用if语句是否有效?
我可以使用带有多个值的if语句,如下所示吗?
if(upper(MON)) in ('JAN','MAR','MAY','JUL','AUG','OCT','DEC') THEN {DO SOMETHING}
答案 0 :(得分:3)
鉴于你的代码有多复杂,IF的效率可能是你问题中最小的。我想你的公司不会因为分区许可证而兴奋不已。 (作者注:这句话指的是OP编辑后的查询原始版本中发布的代码。)
然而,你的方法不会奏效。你不能在这样的DDL中使用IF。你需要做点别的事。
除非所有表都已存在,否则您的视图将无法编译。因此,我将假设您有某种形式的预定作业,这些作业会创建这些表,然后创建视图。在这种情况下,您可以从数据字典中驱动该过程(注意:未经测试的代码,您可能需要修复拼写错误)。
CREATE OR REPLACE PROCEDURE monthly_view (
MON_P VARCHAR2,
YEAR_P VARCHAR2 DEFAULT TO_CHAR (SYSDATE, 'YY'))
IS
l_stmt varchar2(32767);
BEGIN
l_stmt := 'CREATE OR REPLACE VIEW monthly_view_'|| UPPER (MON_P)|| '_'|| YEAR_P||' as ';
for r in ( select table_name from user_tables
where table_name like 'LT_'|| UPPER (MON)||'____'|| YEAR_P||'_BCH'
)
loop
if r.table_name != 'LT_'|| UPPER (MON)||'_01_'|| YEAR_P||'_BCH'
then
l_stmt := l_stmt ||' UNION ALL ';
end if;
l_stmt := l_stmt ||' SELECT * FROM '||r.table_name;
end loop;
execute immediate l_stmt;
END;
/
这种方法只意味着创建表格的例程需要担心月份的日期以及它是否是闰年。
更好的是每年的每个月都没有单独的表格。