Oracle / Toad 中的 For 循环
Posted
技术标签:
【中文标题】Oracle / Toad 中的 For 循环【英文标题】:For Loop in Oracle / Toad 【发布时间】:2015-09-30 12:51:55 【问题描述】:我是 Oracle 和 PL/SQL 的新手,我正在尝试做以下事情。
我从存储在变量中的表名中返回列名
variable v_table varchar2(100)
begin
select 'mytable' into :v_table from dual;
end;
select column_name from all_tab_columns where table_name = :v_table
这会返回一个行集
column_name
colname1
colname2
colname3
我想遍历返回的行集并获取每列的一些统计信息。
select count distinct(colname1), min(colname1), max(colname1)
from :v_table
group by min(colname1), max(colname1)
但是我不知道如何遍历这个行集。
【问题讨论】:
如果您使用 DBMS_Stats 收集有关表的统计信息,则可以直接从数据字典中选择此数据。事实上,它可能已经存在了。 感谢@davidAldridge 的回复。看来我没有执行这些程序的权限。 可能是自动收集统计信息。 【参考方案1】:通过使用下面,您可以显示表的列名并根据您的要求附加您的 sql 查询...
declare
v_table varchar2(100):='TABLE_NAME';
TYPE NT_VAR1 IS TABLE OF VARCHAR2(30);
TYP_NT NT_VAR1;
begin
select column_name BULK COLLECT INTO TYP_NT from all_tab_columns where table_name =v_table
order by column_id;
FOR I IN 1..TYP_NT.COUNT
LOOP
DBMS_OUTPUT.PUT_LINE('COLUMN '||I||': '||TYP_NT(I));
END LOOP;
end;
注意:您应该动态运行选择查询,这意味着使用执行立即为什么,因为您在运行时传递 table_name。
编辑 在 for 循环中编辑查询后,它将如下所示。
declare
v_table varchar2(100):='TABLE_NAME';
TYPE NT_VAR1 IS TABLE OF VARCHAR2(30);
TYP_NT NT_VAR1;
var2 varchar2(2000);
var3 varchar2(2000);
begin
select column_name BULK COLLECT INTO TYP_NT from all_tab_columns where table_name =v_table
order by column_id;
FOR I IN 1..TYP_NT.COUNT
LOOP
DBMS_OUTPUT.PUT_LINE('COLUMN '||I||': '||TYP_NT(I));
EXECUTE IMMEDIATE 'SELECT to_char(min('||TYP_NT(I)||')),to_char(max('||TYP_NT(I)||')) from '||v_table into var2,var3;
dbms_output.put_line(var2||' '||var3);
END LOOP;
end;
注意:找出表中存在的列的最大数据长度,并将相同的数据类型分配给 var2 和 var3 变量。
【讨论】:
谢谢@Tarun。请忽略此评论的最后编辑。它运行良好,我在 DBMS 输出窗口中看到了结果。 是的,您可以看到,您使用的是哪个工具? 我认为你在使用 toad 你能看到数据网格窗口吗? 如果您无法在底部看到 DBMS_OUTPUT 选项卡(在您查看查询结果的位置旁边),请右键单击其中一个选项卡并选择 DBMS_OUTPUT。您可以使用该选项卡上显示的按钮打开/关闭输出。 现在我看到了输出,我正在尝试将我的选择逻辑合并到循环中。但是,似乎我的 v_table 变量没有被传递:code
select column_name BULK COLLECT INTO TYP_NT from all_tab_columns where table_name =v_table order by column_id; FOR I IN 1..TYP_NT.COUNT LOOP 从 v_table 中选择 MIN(TYP_NT(I)), MAX(TYP_NT(I));结束循环;结尾; code
以上是关于Oracle / Toad 中的 For 循环的主要内容,如果未能解决你的问题,请参考以下文章