2014-07-03 129 views
1

我使用SQL Server构建了一个脚本,该脚本遍历数据库中的每个表并构建了一个动态语句,该语句在执行时显示列名,类型,填充值数和总行数每列。执行动态SQL语句表

我现在正在尝试与Oracle构建相同的东西,但我遇到了问题。下面的代码给了我一张充满了所有适当语句的表格,但是我如何执行并显示它们?

>SELECT 
    'SELECT ''' || atc.column_name || ''', ''' || atc.table_name || ''', ''' ||  atc.data_type || ''', 
SUM(CASE WHEN temp.'|| atc.column_name || ' IS NULL THEN 0 ELSE 1 END) "Filled  Values", 
    COUNT(temp.' || atc.column_name || ') "Total Records" 
    FROM all_tab_columns atc 
    JOIN '|| atc.table_name || ' temp ON atc.column_name = ''' || 
    atc.column_name ||''' AND atc.table_name = ''' || atc.table_name || '''' AS SQLRow 
FROM all_tab_columns atc; 

这是从上面的代码所产生的语句的示例:

>SELECT 'INITIAL_EXTENT', 'ALL_ALL_TABLES', 'NUMBER', 
SUM(CASE WHEN temp.INITIAL_EXTENT IS NULL THEN 0 ELSE 1 END) "Filled Values", 
COUNT(temp.INITIAL_EXTENT) "Total Records" 
FROM all_tab_columns atc 
JOIN ALL_ALL_TABLES temp ON atc.column_name = 'INITIAL_EXTENT' AND atc.table_name =  'ALL_ALL_TABLES' 

回答

3

下面是一个尝试:

declare 
    myCol1 varchar2(1000); 
    myCol2 varchar2(1000); 
    myCol3 varchar2(1000); 
    myCol4 number; 
    myCol5 number; 
begin 
    for line in 
    (
    SELECT 
     'SELECT ''' || atc.column_name || ''', ''' || atc.table_name || ''', ''' ||  atc.data_type || ''', 
    SUM(CASE WHEN temp.'|| atc.column_name || ' IS NULL THEN 0 ELSE 1 END) "Filled  Values", 
     COUNT(temp.' || atc.column_name || ') "Total Records" 
     FROM all_tab_columns atc 
     JOIN '|| atc.table_name || ' temp ON atc.column_name = ''' || 
     atc.column_name ||''' AND atc.table_name = ''' || atc.table_name || '''' AS SQLRow 
    FROM all_tab_columns atc 
) 
    loop 
    dbms_output.put_line(myCol1 || ' | ' || myCol2 || ' | ' || myCol3 || ' | ' || myCol4 || ' | ' || myCol5); 
    execute immediate line.Sqlrow into myCol1, myCol2, myCol3, myCol4, myCol5; 
    end loop; 
end; 
/

这是使用包DBMS_OUTPUT以显示结果作为字符串;如果您希望将结果作为查询集,请考虑使用流水线函数。

编辑:如果您使用SQL Developer,您可以使用this link来查看结果;对于SQL * Plus,请尝试this one。由于此缓冲区输出,您可以看到LONG数据类型的故障表是什么(请注意,在上述解决方案中,我切换了dbms_outputexecute immediate行以在执行之前显示表)。

您还可以在LONG datatypehere找到限制条件。

+0

谢谢@Emmanuel,但是当我运行这个时不打印出结果。我也查找了流水线函数,但我也不太了解这些。 – TaiwanTimmy

+0

当我运行你给我的代码时,它运行了大约两分钟,然后抱怨说这是'非法使用LONG数据类型'。你知道这可能是什么原因吗? – TaiwanTimmy

+0

看到我的编辑,你应该找到好的信息。 – Emmanuel