获取数据库中每一列的示例数据

Get example data for each column in Database

我正在尝试获取数据库中每一列的示例条目 我能想到的最好的是:

SELECT owner || '.' || table_name || '.' || column_name AS ex FROM all_tab_cols;

当我这样做时,我得到了我想要的列表,但是我很难弄清楚如何在 SQL 中循环。

我想我已经缩小了我想做的事情的范围,但我仍然无法弄清楚 PUT_LINE

BEGIN
  FOR i IN (SELECT owner || '.' || table_name || '.' || column_name AS ex
              FROM all_tab_cols) 
  LOOP
    dbms_output.put_line(select * from i fetch first row only);
  END LOOP;
END;
/

我尝试取出第二个 select 并放入 'test',我收到消息“pl/SQL 程序成功完成” 但是没有输出。

这是一个 oracle 数据库,我正在使用 SQL 开发人员。

可能可行的最简单的方法是

declare
  l_sql_stmt varchar2(4000);
  l_value    varchar2(4000);
begin
  for i in (select owner, table_name, column_name
              from all_tab_columns)
  loop
    l_sql_stmt := 'select ' || i.column_name ||
                  '  from ' || i.owner || '.' || i.table_name ||
                  ' fetch first row only';
    execute immediate l_sql_stmt
       into l_value;
    dbms_output.put_line( l_value );
  end loop;
end;

但是,只有当您有权访问的每个 table 中的每一列都可以隐式转换为 varchar2(4000) 时,这才有效。如果您有 lob 列超过 4000 字节长度,或者您有复杂数据类型的列,您将收到错误消息。由于您正在进行隐式转换,因此您会根据会话的 NLS 设置获得不同的数字、日期和时间戳结果,这对您来说可能有问题也可能没有问题。通常明智的做法是至少将谓词添加到游标中的 all_tab_columns 查询,仅 select 那些您准备处理其数据类型的列。

如果您想变得更复杂,可以使用 dbms_sql package 来描述结果并将数据提取到适当数据类型的局部变量中。这可以让您修复隐式转换问题并让您处理更多数据类型(尽管,例如,我不知道您想要为 blob 列显示什么)但它涉及编写很多更多代码,您必须显式处理您希望能够处理的每种数据类型。

根据您尝试这样做的原因,使用优化器至少为具有统计信息的列收集的 column-level 统计信息可能更有意义(但这些可能是您想要的列) d 实际上关心有示例数据)。