0

我有包含 TNAME、CNAME、DTYPE、COLCOMMENT 列的表 TABLE_INFO 我需要在 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

4

3 回答 3

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;

你可以在这里找到结果

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

于 2012-11-16T08:59:33.397 回答
0

试试这个。

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_COLSandDBA_COL_COMMENTS而不是ALL_TAB_COLSand 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   
于 2012-11-16T07:42:38.463 回答
0

我找到了另一个解决方案

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

于 2012-11-16T10:33:08.070 回答