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 循环的主要内容,如果未能解决你的问题,请参考以下文章

Toad for Oracle - 从列选项卡中复制列而不包含所有详细信息

Toad for Oracle安装

toad for oracle可否批量导出存储过程

TOAD for Oracle - 自动完成

循环体中的占位符和无参数 Toad 中的执行过程

在 oracle 中导出脚本中的更改(使用 Toad ?)