我使用SQL Server构建了一个脚本,该脚本遍历数据库中的每个表并构建了一个动态语句,该语句在执行时显示每列的列名,类型,填充值数和总行数。
我现在正在尝试与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'
答案 0 :(得分: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_output
和execute immediate
行以显示表在执行之前)。
您还可以在LONG datatype
here上找到限制。