【问题标题】:Making "CREATE TABLE" statements from data of table从表的数据制作“CREATE TABLE”语句
【发布时间】:2012-11-16 06:28:26
【问题描述】:

我有 TABLE_INFO 表,其中包含 TNAME、CNAME、DTYPE、COLCOMMENT 列 我需要在 Oracle SQL Developer 中创建一个 SQL 脚本,它使用 TNAME 列中的表名、CNAME 中的列、DTYPE 中的列数据类型和 COLCOMMENT 中的列注释创建新表 我该怎么做?

例如表 TABLE_INFO 有以下数据:

|TNAME |域名 |类型 |评论 |

1|员工 | Emp_ID |号码 |员工编号 |

2|员工 | Emp_Nm| VARCHAR |员工姓名 |

3|职位 |职位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

【问题讨论】:

  • 我对此有一种不好的感觉!

标签: sql oracle oracle-sqldeveloper


【解决方案1】:

哦,我糊涂了。

这是架构的代码:

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;

你可以在here找到结果

注意:我只在 Oracle 使用了ROW_NUMBER () 函数。请注意这一点。

【讨论】:

  • 谢谢!这正是我所需要的
【解决方案2】:

试试这个。

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_COLSDBA_COL_COMMENTS 而不是 ALL_TAB_COLSALL_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   

【讨论】:

  • 不是我真正需要的,请看问题,我已经更新了
【解决方案3】:

我找到了另一个解决方案

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 是对专栏的评论

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-12
    • 2018-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-15
    相关资源
    最近更新 更多