获取数据库中每一列的示例数据
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 实际上关心有示例数据)。
我正在尝试获取数据库中每一列的示例条目 我能想到的最好的是:
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 实际上关心有示例数据)。