Excel数据字典生成对应Oracle创表语句

364 阅读1分钟

总览:

  1. 创建一个测试表TEST、创表语句CREATE_TABLE表
  2. 按Excel模板的东西插入到TEST表
  3. 创建存储过程执行
  4. 复制创表语句

第一步:创建TEST、CREATE_TABLE表 image.png image.png

第二步:按Excel模板的东西插入到TEST表 image.png image.png

第三步:创建存储过程

create or replace procedure create_table_by_excel
as
    sql_statement          varchar2(4000);       --存储SQL
    sql_statement2         varchar2(4000);       --存储SQL
    sql_comment            clob;                 --注释
    sql_comment2           clob;                 --注释  字段注释过多会导致4000的长度超长
    table_name_eng         varchar2(1000);       --英文表名
    table_name_cn          varchar2(1000);       --中文表名
    create_sql_comment     varchar2(4000);       --存储返回的建表语句
begin
    sql_statement          :='';       --存储每张表建表语句
    sql_statement2         :='';       --存储每个字段建表语句
    sql_comment            :='';       --存储每张表注释
    sql_comment2           :='';       --存储每个字段注释
    table_name_eng         :='';       --英文表名
    table_name_cn          :='';       --中文表名

    for item in(select TAB_NAME, TAB_NAME_COMMENT from test group by TAB_NAME, TAB_NAME_COMMENT)
    loop
        --表名赋值
        table_name_eng := item.TAB_NAME;
        table_name_cn := item.TAB_NAME_COMMENT;

        --清空sql_statement
        sql_statement := '';
        sql_statement2 := '';
        sql_comment :='';
        sql_comment2 :='';

        sql_statement := sql_statement || 'create table '|| table_name_eng || '( ' || chr(10);
        for details in(select COL_NAME, DATA_TYPE, COL_COMMENT from test  where upper(TAB_NAME) = upper(table_name_eng))
        loop
            --拼接创建表语句
            sql_statement2 :=  sql_statement2 || '  '  || details.COL_NAME || ' ' || details.DATA_TYPE ||', '|| chr(10);

            --拼接字段注释
            sql_comment2 :='';
            sql_comment2 := sql_comment2 || 'comment on column ' || table_name_eng || '.' || details.COL_NAME || ' is ' || '''' ||details.COL_COMMENT|| '''' ||';';

            sql_comment := sql_comment || chr(13) || sql_comment2;
            dbms_output.put_line(sql_comment);
        end loop;

        --去掉最后多拼接的逗号
        sql_statement := sql_statement || substr(sql_statement2, 0, length(sql_statement2)-3);

        --后面的右括号
        sql_statement := sql_statement || chr(10) || ');';

        --拼接表名注释
        sql_comment := 'comment on table ' || table_name_eng || ' is ' || '''' || table_name_cn || '''' || ';' || sql_comment;

        --优化建表语句,没有长度的字段类型()需要删除
        sql_statement := replace(sql_statement, '()', '');

        --建表语句
        insert into create_table(tab_name, create_sql, tab_comment, create_sql_comment) values(table_name_eng, sql_statement, sql_comment, sql_statement || chr(10) || sql_comment);
        commit;

        -- 执行创建语句和注释语句
        --sql_statement := replace(sql_statement, ';', '');
        --execute immediate sql_statement;
        --execute immediate sql_comment;

     end loop;
end create_table_by_excel;

然后调用执行:call create_table_by_excel(); 即可得到了创表语句 image.png

第四步:复制创表语句 image.png image.png 又或者将存储过程注释放开执行:
execute immediate sql_statement;
execute immediate sql_comment;

结尾:到此结束了,类似这样,其实还可以用Python处理一下(网上也有一些方法)

如果觉得有点帮助,麻烦点下赞呗