【发布时间】:2013-04-08 12:06:03
【问题描述】:
我需要在 Oracle 中创建表时附加 SYSDATE。请让我知道是否有直接的方法(仅使用 SQL)或者我必须使用 PL/SQL。
例如如果表名是ABC,我需要创建表为ABC_20130416。
如果需要更多信息,请告诉我。
【问题讨论】:
我需要在 Oracle 中创建表时附加 SYSDATE。请让我知道是否有直接的方法(仅使用 SQL)或者我必须使用 PL/SQL。
例如如果表名是ABC,我需要创建表为ABC_20130416。
如果需要更多信息,请告诉我。
【问题讨论】:
如果 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;
/
【讨论】:
仅使用 PL/SQL:
begin
execute immediate 'create table foo_' || your_timestamp_here ;
end;
【讨论】:
DATE(或TIMESTAMP)的转换是使用隐式数据类型转换完成的,这意味着它受NLS设置的约束并且可以(并且很可能会)以表的非法名称。即使它起作用了,它也很可能不是 Sid 所期望的名字。您应该始终使用带有格式模型的 to_char() 将日期/时间戳转换为字符串。
'create table foo_' || your_timestamp_here 是隐式类型转换。
your_timestamp_here 已经是VARCHAR2,则不会。
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;
【讨论】: