将现有表逆向生成DDL语句

来源:转载

create or replace procedure tab_sync_create(v_tab_name varchar2,v_data_link varchar2 default null)as type cur_type is ref cursor; cur_policy cur_type; rec_tab_columns user_tab_columns%rowtype; rec_tab_comments user_tab_comments%rowtype; rec_col_comments user_col_comments%rowtype; n_count number default 0; v_at varchar2(50) default null; v_type varchar2(50) default null; v_create_tab_sql varchar2(4000) default null;begin --生成数据链 if v_data_link is not null then v_at := '@'||v_data_link; end if; /* -- 打开游标 -- */ open cur_policy for 'select table_name, column_name, data_type, char_length, data_length, data_precision, data_scale, nullable from user_tab_columns'||v_at||' where table_name=upper('''||v_tab_name||''')'; --生成建表语句头 /* 备注: chr(9) 制表符 chr(10) 回车符 chr(13) 换行符 chr(32) 空格符 */ v_create_tab_sql := 'create table '||v_tab_name||' ('||chr(13); /* -- 操作游标 -- */ loop fetch cur_policy into rec_tab_columns.table_name, rec_tab_columns.column_name, rec_tab_columns.data_type, rec_tab_columns.char_length, rec_tab_columns.data_length, rec_tab_columns.data_precision, rec_tab_columns.data_scale, rec_tab_columns.nullable; /* -- 循环结束条件 -- */ exit when cur_policy%notfound; --添加上一条记录逗号 if n_count!=0 then v_create_tab_sql := v_create_tab_sql||','||chr(13); end if; --生成字段类型格式 if rec_tab_columns.data_type='NVARCHAR2' then v_type := 'NVARCHAR2('||rec_tab_columns.char_length||')'; elsif rec_tab_columns.data_type='VARCHAR2' then/* 注意是elsif不是elseif */ v_type := 'VARCHAR2('||rec_tab_columns.data_length||')'; elsif rec_tab_columns.data_type='CHAR' then v_type := 'CHAR('||rec_tab_columns.data_length||')'; elsif rec_tab_columns.data_type='NUMBER' then if rec_tab_columns.data_precision is null then --先判断 data_precision 为空 v_type := 'NUMBER'; elsif rec_tab_columns.data_scale=0 then --再判断 data_scale 为0 v_type := 'NUMBER('||rec_tab_columns.data_precision||')'; else --最后处理一般情况 v_type := 'NUMBER('||rec_tab_columns.data_precision||','||rec_tab_columns.data_scale||')'; end if; elsif rec_tab_columns.data_type='FLOAT' then v_type := 'FLOAT'; elsif rec_tab_columns.data_type='DATE' then v_type := 'DATE'; end if; --生成字段串 v_create_tab_sql := v_create_tab_sql|| chr(9)||rec_tab_columns.column_name|| chr(32)||v_type|| case when rec_tab_columns.nullable='Y' then null else chr(32)||'not null' end; --记录执行成功数 n_count := n_count+1; end loop; --生成建表语句尾,同时转小写 v_create_tab_sql := lower(v_create_tab_sql)||chr(13)||')'; /* -- 关闭游标 -- */ close cur_policy; --输出结果 dbms_output.put_line(v_create_tab_sql); /* -- 生成表备注 -- */ open cur_policy for 'select * from user_tab_comments'||v_at||' where table_name=upper('''||v_tab_name||''')'; loop fetch cur_policy into rec_tab_comments.table_name,rec_tab_comments.table_type,rec_tab_comments.comments; exit when cur_policy%notfound; if rec_tab_comments.comments is not null then dbms_output.put_line('comment on table '||rec_tab_comments.table_name||' is '''||rec_tab_comments.comments||''''); end if; end loop; close cur_policy; /* -- 生成列备注 -- */ open cur_policy for 'select * from user_col_comments'||v_at||' where table_name=upper('''||v_tab_name||''')'; loop fetch cur_policy into rec_col_comments.table_name,rec_col_comments.column_name,rec_col_comments.comments; exit when cur_policy%notfound; if rec_col_comments.comments is not null then dbms_output.put_line('comment on column '||rec_col_comments.table_name||'.'||rec_col_comments.column_name||' is '''||rec_col_comments.comments||''''); end if; end loop; close cur_policy; exception when others then --log_msg('tab_sync_create['||v_tab_name||']错误:'||sqlerrm,'失败'); dbms_output.put_line('tab_sync_create['||v_tab_name||']错误:'||sqlerrm);end tab_sync_create;


分享给朋友:
您可能感兴趣的文章:
随机阅读: