循环创建 Oracle 表

Posted

技术标签:

【中文标题】循环创建 Oracle 表【英文标题】:Create Oracle Tables in a Loop 【发布时间】:2016-10-27 17:35:49 【问题描述】:

我正在尝试创建 1 个 PL/SQL 语句,它允许我在每次连续的日期时间迭代后获得多个表输出,并用该日期时间迭代的年份重命名每个表。下面的示例具有所需的结果。谢谢

  Create table MY_TIME_XX AS 
   ( Select 
    X.* 
    FROM Metadata X )
    Where X.Datetime between '01/01/2014' and '12/31/2014'

所以最后我的架构会有

    MY_TIME_14 MY_TIME_15 MY_TIME_16

等等……

【问题讨论】:

你为什么喜欢这样做?很可能它没有任何意义。 (Select * FROM Metadata X)不仅仅是我展示的五年跨度,它也相当大。我的临时文件保存得不好所以我想每年都做一个,然后把它放到一个分区单表中。 不要在日期比较中使用字符串文字,使用日期文字或 to_date 函数:例如使用to_date('01/01/2014','mm/dd/yyyy')date '2014-1-1' 而不是'01/01/2014' 为什么不首先创建分区表。您仍然可以一次插入一年的数据,而不是一次插入所有数据。 不明白想要做的逻辑。但不会很难做到。看看docs.oracle.com/cd/B19306_01/appdev.../…。只需将您的 create table 语句构建为字符串,然后使用 execute immediate 将其关闭。 【参考方案1】:

这样的工作需要动态 SQL。 假设您知道范围内的年份,这样的事情应该可以帮到您。

begin
    for idx in 2014..2016 loop
        execute immediate 
            'Create table MY_TIME_'|| idx ||' AS  
                Select  X.* 
                FROM Metadata X 
                Where to_char(X.Datetime, ''yyyy'') = '''|| idx||'''';
    end loop;
end;  

注意使用双引号来转义字符串中的文字。

【讨论】:

以上是关于循环创建 Oracle 表的主要内容,如果未能解决你的问题,请参考以下文章

仅针对特定表的 Oracle View 循环

在 Oracle PL/SQL 中复制 SAS DO 循环

oracle查询表用for in loop循环出来更新

关于oracle循环语句的一个问题

oracle数据库使用数值型for循环,打印九九乘法口诀表

SQL用循环查询的结果 建临时表