【问题标题】:Append sysdate to a table name in Oracle将 sysdate 附加到 Oracle 中的表名
【发布时间】:2013-04-08 12:06:03
【问题描述】:

我需要在 Oracle 中创建表时附加 SYSDATE。请让我知道是否有直接的方法(仅使用 SQL)或者我必须使用 PL/SQL。

例如如果表名是ABC,我需要创建表为ABC_20130416。

如果需要更多信息,请告诉我。

【问题讨论】:

    标签: oracle sysdate


    【解决方案1】:

    如果 SQL*Plus 始终可用,您可以使用变量来执行此操作,例如(未经测试):

    SQL>col yyyymmdd for a8 new_value v
    SQL>select to_char(sysdate, 'YYYYMMDD') as yyyymmdd from dual;
    SQL>create table ABC_&v (col1 integer);
    

    另一方面,如果您希望能够在任何地方执行此操作,您将需要 PL/SQL 和动态 SQL:

    declare
      l_tablename varchar2(30) := 'ABC_' || to_char(sysdate, 'YYYYMMDD')
    begin
      execute immediate 'create table ' || l_tablename || ' (col1 integer)';
    end;
    /
    

    或者只是先正常创建表,然后重命名:

    create table xyz (
      ... many columns ...
    );
    
    declare
      l_tablename varchar2(30) := 'ABC_' || to_char(sysdate, 'YYYYMMDD')
    begin
      execute immediate 'rename xyz to ' || l_tablename;
    end;
    /
    

    【讨论】:

    • 该解决方案看起来不错..但我已经有一个创建表脚本,而且它太大了..即太大而无法放入 varchar2 中,不能像这样使用..这就是为什么我问它是否可以使用SQL 本身
    • 为什么不先用 SQL 创建表,然后用一个短的 PL/SQL 块来重命名它?
    • 对不起...这很好用..但如果有只使用 SQL 的方法请告诉我
    • 刚刚看到你的第二条评论..这个解决方案似乎可行......你能给我一个例子来说明如何创建一个表,然后将其重命名为附加日期..
    • 好吧,既然它是一个 SQL 脚本,我假设您使用的是 SQL*Plus?然后就可以使用第一种方案了。
    【解决方案2】:

    仅使用 PL/SQL:

    begin
      execute immediate 'create table foo_' || your_timestamp_here ;
    end;
    

    【讨论】:

    • 这不是一个好的解决方案。从您的解决方案中的DATE(或TIMESTAMP)的转换是使用隐式数据类型转换完成的,这意味着它受NLS设置的约束并且可以(并且很可能会)以表的非法名称。即使它起作用了,它也很可能不是 Sid 所期望的名字。您应该始终使用带有格式模型的 to_char() 将日期/时间戳转换为字符串。
    • @a_horse_with_no_name,我从未暗示任何隐式转换。我只是想表明它必须使用 PL/SQL 来完成。纯 SQL 是没有办法的。
    • 表达式'create table foo_' || your_timestamp_here 隐式类型转换。
    • @a_horse_with_no_name,如果your_timestamp_here 已经是VARCHAR2,则不会。
    【解决方案3】:

    PL/SQL 代码:

    declare
      tabname varchar(32);
    begin
      tabname := 'abc'|| TO_CHAR(SYSDATE, 'YYYYMMDD');
      execute immediate 'create table '|| tabname ||' ( f1 number, f2 number, f3 number)';
    end;
    

    【讨论】:

      猜你喜欢
      • 2012-11-03
      • 2020-02-16
      • 1970-01-01
      • 2011-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多