执行动态SQL语句表

执行动态SQL语句表,sql,oracle,Sql,Oracle,我使用SQL Server构建了一个脚本,该脚本遍历了数据库中的每个表,并构建了一个动态语句,执行该语句时,将显示列名称、类型、填充值的数量以及每列的总行数 我现在正试图用Oracle构建同样的东西,但我遇到了问题。下面的代码为我提供了一个包含所有适当语句的表,但是如何执行和显示它们呢 >SELECT 'SELECT ''' || atc.column_name || ''', ''' || atc.table_name || ''', ''' || atc.data_ty

我使用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'
下面是一个尝试:

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;
/
这是使用package
DBMS\u输出
将结果显示为字符串;如果将结果作为查询集,请考虑使用流水线函数。

编辑:如果使用SQL Developer,可以使用查看结果;对于SQL*Plus,请尝试。由于这个缓冲区输出,您可以看到
LONG
数据类型的失败表是什么(注意,在上面的解决方案中,我切换了
dbms\u输出
execute immediate
行,以便在执行之前显示该表)


您还可以找到关于
长数据类型的限制

谢谢@Emmanuel,但当我运行此命令时,它不会打印结果。我还查找了流水线函数,但我也不太了解这些函数。当我运行你给我的代码时,它运行了大约两分钟,然后抱怨说这是非法使用长数据类型。你知道这可能是什么原因吗?