YPE AS SQLTYPE1,B.SQLTYPE AS SQLTYPE2,A.ALLTYPE AS ALLTYPE1,B.ALLTYPE AS ALLTYPE2,A.ISNULLABLE AS ISNULLABLE1,B.ISNULLABLE AS ISNULLABLE2,A.COLUMN_ID
FROM ##TEMPSOURCE A JOIN ##TEMPTARGET B ON (A.TABLENAME=B.TABLENAME AND A.COLUMNNAME=B.COLUMNNAME AND (CONVERT(VARCHAR,A.SQLTYPE)<>CONVERT(VARCHAR,B.SQLTYPE) OR A.ISNULLABLE<>B.ISNULLABLE))
ORDER BY A.TABLENAME,A.COLUMN_ID
DROP TABLE ##TEMPSOURCE
DROP TABLE ##TEMPTARGET
END
--------------------------------------------------
二:以下为ORACLE
数据库断自动生成存储过程和获取
数据库DDL语句的过程,最终通过调用CLOB_READ保存入文件中,目前暂未修正超过32767字节的写文本问题。超过32767字节文本会被自动截断。
create or replace PROCEDURE ADD_ALL_TABLES
--功能:执行添加表记录的存储过程,返回大字段,需要保存到文件进行读取
--参数:DBUSER-数据库用户,TBNAME-模糊匹配的表名,如果为空或''则生成全库的过程,SQLTEXT-返回的存储过程大文本字段
--调用:
--作者:郭君
--日期:2013-02-10
(
DBUSER IN VARCHAR2,
TBNAME IN VARCHAR2,
SQLTEXT OUT CLOB
)
AS
CURSOR R_TB IS --参数传递
SELECT * FROM DBA_TABLES WHERE OWNER=DBUSER
AND table_name LIKE '%'||TBNAME||'%' --模糊匹配表名。可生成相同部分结构表的过程
AND table_name NOT LIKE '%$%'; --去掉回收站被删除的表
CURSOR R_COL(TABLENAME VARCHAR2) IS
SELECT * FROM dba_tab_columns WHERE owner=DBUSER
AND table_name=tablename
ORDER BY column_id;
r_tb_list dba_tables%rowtype;
r_col_list dba_tab_columns%rowtype;
addcol1 VARCHAR2(4000):='';
addcol2 VARCHAR2(4000):='';
BEGIN
OPEN r_tb;
LOOP--外循环
FETCH r_tb INTO r_tb_list;
EXIT WHEN r_tb%notfound;
sqltext:=sqltext||'--------------------------------------------------------'||CHR(10);
sqltext:=sqltext||'-- DDL for Procedure ADD_'||substr(r_tb_list.table_name,0,25)||'(添加'||r_tb_list.table_name||'表记录)'||CHR(10);
sqltext:=sqltext||'--------------------------------------------------------'||CHR(10);
sqltext:=sqltext||'CREATE OR REPLACE PROCEDURE ADD_'||substr(r_tb_list.table_name,0,25)||CHR(10)||'('||CHR(10);
addcol1:='';
addcol2:='';
OPEN r_col(r_tb_list.table_name);
LOOP
FETCH R_COL INTO R_COL_LIST;
EXIT when R_COL%NOTFOUND;
sqltext:=sqltext||' p'||r_col_list.column_name||' IN '||r_col_list.data_type||','||CHR(10); --参数名称默认以小写'p'开头,可以修改该处的规则为想要的命名方式
ADDCOL1:=ADDCOL1||R_COL_LIST.COLUMN_NAME||',';
addcol2:=addcol2||'p'||r_col_list.column_name||','; --参数名称默认以小写'p'开头,可以修改该处的规则为想要的命名方式
END LOOP;
CLOSE r_col;
addcol1:= substr(addcol1, 0, LENGTH(addcol1)-1);
addcol2:= substr(addcol2, 0, LENGTH(addcol2)-1);
sqltext:=substr(sqltext, 0, LENGTH(sqltext)-2)||CHR(10)||')'||CHR(10)||'AS'||CHR(10)||'BEGIN'||CHR(10)||' INSERT INTO '||r_tb_list.table_name||'('||addcol1||')'||CHR(10)||' VALUES('||addcol2||');'||CHR(10)||' COMMIT;'||CHR(10)||'END ADD_'||substr(r_tb_list.table_name,0,25)||';'||CHR(10)||'/'||CHR(10);
END LOOP;
CLOSE r_tb;
END;
/
create or replace PROCEDURE DEL_ALL_TABLES
--功能:执行删除的存储过程(根据主键列删除,注意标识符不能超过30个字符),返回大字段,需要保存到文件进行读取
--参数:DBUSER-数据库用户,TBNAME-模糊匹配的表名,如果为空或''则生成全库的过程,SQLTEXT-返回的存储过程大文本字段
--调用:
--作者:郭君
--日期:2013-02-10
(
DBUSER IN VARCHAR2,
TBNAME IN VARCHAR2,
SQLTEXT OUT CLOB
)
AS
CURSOR r_tb IS --参数传递
SELECT * FROM dba_ta