Создание операторов CREATE TABLE из данных таблицы

У меня есть таблица TABLE_INFO со столбцами TNAME, CNAME, DTYPE, COLCOMMENT. Мне нужно создать сценарий SQL в Oracle SQL Developer, который создает новую таблицу с именем таблицы из столбца TNAME, столбцов из CNAME, типа данных столбцов из DTYPE и комментария к столбцу из COLCOMMENT. Как я могу это сделать?

Например, таблица TABLE_INFO имеет следующие данные:

|ИМЯ | ЗАПИСЬ | ТИП | Комментарий |

1|Сотрудник | Emp_ID | НОМЕР | Идентификатор сотрудника |

2|Сотрудник | Эмп_Нм| ВАРЧАР | Имя сотрудника |

3|Работа | Job_ID | НОМЕР | Идентификатор работы | и т.п.

Мне нужно написать много операторов CREATE TABLE, например:

CREATE TABLE EMLOYEE (EMP ID NUMBER, Emp_Nm VARCHAR)

COMMENT ON COLUMN EMP_ID is ''Employee ID''

COMMENT ON COLUMN EMP_NM is ''Employee NAME''

для каждого TNAME


person David Kakauridze    schedule 16.11.2012    source источник
comment
У меня плохое предчувствие по этому поводу!   -  person Jamiec    schedule 16.11.2012


Ответы (3)


О, я запутался.

Это код для схемы:

CREATE TABLE TABLE_INFO
(
    TNAME        VARCHAR2 (30)
   ,CNAME        VARCHAR2 (30)
   ,DTYPE        VARCHAR2 (30)
   ,COLCOMMENT   VARCHAR2 (100)
);

INSERT INTO TABLE_INFO VALUES ('Employee','Emp_ID','NUMBER','Employee ID');
INSERT INTO TABLE_INFO VALUES ('Employee','Emp_Nm','VARCHAR','Employee Name');
INSERT INTO TABLE_INFO VALUES ('Employee','Emp_Sal','NUMBER','Employee Salary');
INSERT INTO TABLE_INFO VALUES ('Job','Job_ID','NUMBER','Job ID');
INSERT INTO TABLE_INFO VALUES ('Job','Job_Nm','VARCHAR','Job Name');
INSERT INTO TABLE_INFO VALUES ('Department','Dept_ID','VARCHAR','Department ID');
INSERT INTO TABLE_INFO VALUES ('Department','Dept_Nm','VARCHAR','Department Name');

И это код для выполнения:

-- FOR TABLE CREATION
SELECT 
 CASE WHEN RNO = 1 THEN 'CREATE TABLE '||T1.TNAME||' ( ' ELSE '    ' END ||
 T2.CNAME || ' ' || T2.DTYPE ||
 CASE WHEN CNT = RNO THEN ');' ELSE ',' END AS SQLTEXT
  FROM (  SELECT TNAME
                ,COUNT (1) CNT
            FROM TABLE_INFO
        GROUP BY TNAME) T1
      ,(SELECT ROW_NUMBER () OVER (PARTITION BY TNAME ORDER BY CNAME) RNO
              ,X.*
          FROM TABLE_INFO X) T2
 WHERE T1.TNAME = T2.TNAME
ORDER BY T1.TNAME, T2.RNO;

-- FOR COMMENT CREATION
SELECT 'COMMENT ON TABLE ' || TNAME || '.' || CNAME || ' IS ''' || COLCOMMENT || ''';' AS SQLTEXT
  FROM TABLE_INFO;

Вы можете найти результат на здесь

ПРИМЕЧАНИЕ. Я использовал функцию ROW_NUMBER () только в Oracle. Пожалуйста, имейте это в виду.

person kangbu    schedule 16.11.2012
comment
Спасибо! Это то, что мне нужно - person David Kakauridze; 16.11.2012

Попробуй это.

SELECT T1.TABLE_NAME
      ,T1.COLUMN_NAME
      ,T1.DATA_TYPE
      ,T2.COMMENTS
  FROM ALL_TAB_COLS T1
      ,ALL_COL_COMMENTS T2
 WHERE T1.OWNER = T2.OWNER
   AND T1.TABLE_NAME = T2.TABLE_NAME
   AND T1.COLUMN_NAME = T2.COLUMN_NAME

Он извлечет информацию обо всех доступных таблицах.

Чтобы включить таблицы DBA, используйте DBA_TAB_COLS и DBA_COL_COMMENTS вместо ALL_TAB_COLS и ALL_COL_COMMENTS соответственно.

Вы также можете указать дополнительные условия для этого запроса.

Чтобы вставить это,

INSERT INTO TABLE_INFO (
                TNAME
               ,CNAME
               ,DTYPE
               ,COLCOMMENT)
    SELECT T1.TABLE_NAME
          ,T1.COLUMN_NAME
          ,T1.DATA_TYPE
          ,T2.COMMENTS
      FROM ALL_TAB_COLS T1
          ,ALL_COL_COMMENTS T2
     WHERE T1.OWNER = T2.OWNER
       AND T1.TABLE_NAME = T2.TABLE_NAME
       AND T1.COLUMN_NAME = T2.COLUMN_NAME   
person kangbu    schedule 16.11.2012
comment
Не совсем то, что мне нужно, пожалуйста, посмотрите на вопрос, я его обновил - person David Kakauridze; 16.11.2012

Я нашел другое решение

CREATE OR REPLACE

PROCEDURE CREATEFROMTABLE AS

BEGIN

    for j in (select DISTINCT tname from t_info) loop `

    dbms_output.put_line('create table '|| j.tname || ' as (');`

                for col in (select CNAME, dtype from T_INFO where tname = j.tname) 
                loop
                        dbms_output.put_line(col.cname|| '   ' || col.dtype);
                end loop;

               dbms_output.put_line(')');`

               dbms_output.put_line('');`

                for col in (select cname, dcmt from T_INFO where tname = j.tname) `

                loop`

                    dbms_output.put_line('COMMENT ON COLUMN '|| col.cname || ' is ' || col.dcmt || ' ');`

               end loop;    `

    `dbms_output.put_line(' ');`

    `end loop;`

END CREATEFROMTABLE;

t_info — основная таблица со столбцами tname, cname, dcmt

tname — новое имя таблицы

cname — имя столбца

dcmt — это комментарий к столбцу

person David Kakauridze    schedule 16.11.2012