2017-05-29 48 views
0

我有以下脚本来计算特定所有者的每个表的所有行。它完美的作品。 然而,一些表有一个名为“老字号”和其他不... 我现在的脚本不考虑特定的列,如果此列存在与否:SQL Oracle - 如果一个特定列存在,所有表的不同计数

DECLARE 
val NUMBER; 
BEGIN 
FOR I IN (SELECT table_name FROM all_tables where owner='myowner') LOOP 
EXECUTE IMMEDIATE 'SELECT count(*) FROM myowner.' || i.table_name INTO val; 
DBMS_OUTPUT.PUT_LINE(i.table_name || ';' || val); 
END LOOP; 
END; 

所以我想什么添加如下: 如果OLD列存在,则在OLD = 0(其中OLD = 0)时将其考虑在内,如果不存在,则在不考虑此列的情况下继续执行“正常”计数。 希望我已经清楚了;)

非常感谢!

一个例子: 让我们说我有2个表:

Table1 - columns A B C with the following data: 
1 "test" "Steve" 
2 "test2" "George" 
Table2 - columns E F G OLD with the following data: 
1 "test3" "Martin" 0 
2 "test4" "Lucas" 0 
3 "test5" "Marley" 0 
4 "test6" "Bob" 55 

结果应该然后是:

表1; 2 - >有没有 '老' 栏,所以我做一个simples计数 ,其返回2

表2; 3 - >有“老”柱所以我提出的计数,其中OLD = 0 和它返回然后3

+0

咦?不明白。请用数据显示一个例子。 – OldProgrammer

+0

让我们说我有2个表: '表1 - 列ABC数据如下: 1“测试”“史蒂夫” 2“测试2”“乔治” 表2 - 列EFG OLD数据如下: 1“ TEST3" “马丁” 0 2 “TEST4” “卢卡斯” 0 3 “TEST5” “马利” 0 4 “TEST6”, “鲍勃” 55' 结果应该是然后: 表1; 2 - >有被而不是'OLD'列,所以我做了一个简单的计数,返回2 Table2; 3 - >有'OLD'列,所以我做了一个计数,其中OLD = 0,然后返回3 – Thiago

+0

PLease编辑问题并把样本放入问题文本。评论中很难阅读。谢谢。 – OldProgrammer

回答

0

尝试:

DECLARE 
    val NUMBER; 
BEGIN 
FOR I IN (
    select a.table_name, c.column_name 
    from all_tables a 
    left join all_tab_cols c 
    ON a.owner = c.owner and a.table_name = c.table_name and c.column_name = 'OLD' 
    where a.owner = 'MYOWNER' 
) 
LOOP 
    IF i.column_name IS NULL THEN 
     EXECUTE IMMEDIATE 'SELECT count(*) FROM MYOWNER.' || i.table_name INTO val; 
    ELSE 
     EXECUTE IMMEDIATE 'SELECT count(*) FROM MYOWNER.' || i.table_name 
          || ' WHERE old = 0' INTO val; 
    END IF; 
    DBMS_OUTPUT.PUT_LINE(i.table_name || ';' || val); 
END LOOP; 
END; 
相关问题