Добавить sysdate к имени таблицы в Oracle

Мне нужно добавить SYSDATE при создании таблицы в Oracle. Пожалуйста, дайте мне знать, есть ли прямой способ сделать это (используя только SQL) или мне нужно использовать PL/SQL для того же.

Например. Если имя таблицы ABC, мне нужно создать таблицу как ABC_20130416.

Дайте мне знать, если потребуется дополнительная информация.


person Sid    schedule 16.04.2013    source источник


Ответы (3)


Если 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;
/
person Colin 't Hart    schedule 16.04.2013
comment
решение выглядит хорошо ... но у меня уже есть скрипт создания таблицы, и он слишком большой ... то есть слишком большой, чтобы поместиться внутри varchar2, чтобы его можно было использовать так ... вот почему я спросил, возможно ли это с использованием самого SQL - person Sid; 16.04.2013
comment
Почему бы не создать таблицу сначала с помощью SQL, а затем с помощью короткого блока PL/SQL, чтобы переименовать ее? - person Colin 't Hart; 16.04.2013
comment
извините... это работает хорошо... но дайте мне знать, есть ли способ использовать только SQL - person Sid; 16.04.2013
comment
только что увидел ваш второй комментарий .. решение кажется возможным ... не могли бы вы привести мне пример того, как создать таблицу, а затем переименовать ее, чтобы добавить дату .. - person Sid; 16.04.2013
comment
Ну, так как это скрипт SQL, я предполагаю, что вы используете SQL * Plus? Тогда вы можете использовать первое решение. - person Colin 't Hart; 16.04.2013
comment
В интересах полноты docs.oracle.com/cd/B19306_01 /server.102/b14200/, но на самом деле переименовать Oracle в Google очень просто. - person Colin 't Hart; 16.04.2013
comment
у меня переименование не работает, так как я все еще не могу добавить sysdate к имени таблицы... как я уже сказал, это будет автоматизация, и я не хочу каждый раз вводить дату вручную... спасибо за предложение... - person Sid; 16.04.2013
comment
Почему у вас не работает переименование? Я обновил свой ответ, чтобы показать, как это можно сделать. - person Colin 't Hart; 16.04.2013

Только с PL/SQL:

begin
  execute immediate 'create table foo_' || your_timestamp_here ;
end;
person Michael-O    schedule 16.04.2013
comment
Это не очень хорошее решение. Преобразование из DATE (или TIMESTAMP) в вашем решении выполняется с использованием неявного преобразования типа данных, что означает, что оно зависит от настройки NLS и может (и, скорее всего, будет) иметь недопустимое имя для стол. Даже если это сработает, скорее всего, это будет не то имя, которое ожидает Сид. Вы всегда должны использовать to_char() с моделью формата для преобразования даты/времени в строку. - person a_horse_with_no_name; 16.04.2013
comment
@a_horse_with_no_name, я никогда не подразумевал неявное преобразование. Я просто хотел показать, что это нужно делать с помощью PL/SQL. С чистым SQL никак. - person Michael-O; 16.04.2013
comment
Выражение 'create table foo_' || your_timestamp_here является неявным преобразованием типа. - person a_horse_with_no_name; 16.04.2013
comment
@a_horse_with_no_name, а не если your_timestamp_here уже является VARCHAR2. - person Michael-O; 16.04.2013

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;
person M.J.Ahmadi    schedule 16.04.2013