Oracle8i中生成创建对象的SQL REM REM author: 朱伟民, time:15:20 01-8-4 REM 版权 :sinosoft REM version:1.0 REM 从 oracle8i Enterprise Edition 数据库生成创建对象的脚本文件 REM -- -- 包头定义 -- CREATE OR REPLACE PACKAGE srcmake AS PROCEDURE maktab; PROCEDURE makview; PROCEDURE makseq; PROCEDURE makcon(tabName VARCHAR2); END srcmake; / -- -- 包体定义 -- CREATE OR REPLACE PACKAGE BODY srcmake AS -- -- 处理超过255个字符的行的输出 -- PROCEDURE dealline(initStr VARCHAR2) IS lineCount INTEGER; i INTEGER; BEGIN lineCount := ceil(length(initStr)/255); FOR i IN 1..lineCount LOOP dbms_output.put_line(substr(initStr,1 + 255 * (i - 1),255)); END LOOP; END dealline; -- -- 生成创建表的SQL文件 -- PROCEDURE maktab IS tempStr varchar2(4000); countNum integer; i integer; BEGIN dbms_output.enable(9E38); -- 输出sql文件说明信息 dbms_output.put_line('REM create table''s sql'); dbms_output.put_line('REM database user name:'||user); dbms_output.put_line('REM outputTime:'||sysdate); -- 查询用户的所有的表 FOR curtab IN( SELECT a.table_name table_name,a.tablespace_name,b.comments comments FROM user_tables A,user_tab_comments b WHERE a.table_name = b.table_name AND b.table_type = 'TABLE' ORDER BY a.table_name) LOOP -- 输出表信息 dbms_output.put_line(chr(10)||'DROP TABLE '||curtab.table_name||';'); dbms_output.put_line('-- 表名:'||curtab.table_name); dbms_output.put_line('-- 备注:'||curtab.comments); dbms_output.put_line('CREATE TABLE '||curtab.table_name||'('); SELECT count(column_name) INTO countNum FROM user_tab_columns WHERE table_name = curtab.table_name; i := 0; -- 查询表所有的列 FOR curcol IN( SELECT a.*,b.comments FROM user_tab_columns a,user_col_comments b WHERE a.table_name = curtab.table_name AND a.table_name = b.table_name AND a.column_name = b.column_name ORDER BY column_id) LOOP tempStr := chr(9)||rpad(curcol.column_name,31,' ')||curcol.data_type; -- 以下类型需要指定长度 IF curcol.data_type IN('VARCHAR2','CHAR','VARCHAR','RAW') THEN tempStr := tempStr||'('||curcol.data_length||')'; -- 数字类型存在精度问题 ELSIF curcol.data_type = 'NUMBER' THEN IF curcol.data_precision IS NOT NULL THEN tempStr := tempStr||'('||curcol.data_precision; IF curcol.data_scale IS NOT NULL THEN tempStr := tempStr||','||curcol.data_scale||')'; ELSE tempStr := tempStr||')'; END IF; ELSIF curcol.data_scale = 0 THEN tempStr := tempStr||'(38)'; END IF; END IF; -- LONG,LONG RAW,CLOB,NLOB,BLOB,ROWID类型不需指定长度 IF curcol.nullable = 'N' THEN -- 指定非空标志 tempStr := tempStr||' NOT NULL'; END IF; i := i + 1; -- 最后一列不需逗号 IF i != countNum THEN tempStr := tempStr||','; END IF; -- 输出列的信息 IF curcol.comments IS NOT NULL THEN dbms_output.put_line(rpad(tempStr,60,' ')||'-- '||curcol.comments); ELSE dbms_output.put_line(tempStr); END IF; END LOOP; -- 输出表空间信息 dbms_output.put_line(') TABLESPACE '||curtab.tablespace_name||';'); -- 输出表约束 makcon(curtab.table_name); END LOOP; dbms_output.put_line(chr(10)||chr(10)); END maktab; -- -- 生成表的约束(primary key,foreign key) -- parameter:tabName表名称 PROCEDURE makcon(tabName VARCHAR2) IS tempStr VARCHAR2(4000); tempColStr VARCHAR2(2000); BEGIN FOR curcon IN( SELECT owner,constraint_name name,constraint_type type, r_constraint_name rname,delete_rule,r_owner,table_name FROM user_constraints WHERE table_name = tabName AND constraint_type IN('P','R','U')) LOOP -- 输出约束信息 tempStr := 'ALTER TABLE '||tabName||' ADD CONSTRAINTS '||curcon.name; FOR curcol IN(SELECT column_name FROM user_cons_columns WHERE constraint_name = curcon.name) LOOP tempColStr := tempColStr||curcol.column_name||','; END LOOP; tempColStr := substr(tempColStr,0,length(tempColStr) - 1); -- 输出约束的列信息 IF curcon.type = 'P' THEN -- 主键 tempStr := tempStr||' PRIMARY KEY('||tempColStr||');'; ELSIF curcon.type = 'R' THEN -- 外键 tempStr := tempStr||' FOREIGN KEY('||tempColStr||') '||chr(10); tempStr := tempStr||' REFERENCES '||curcon.r_owner||'.'||curcon.table_name||'('||tempColStr||') '; tempStr := tempStr||curcon.delete_rule||';'; ELSIF curcon.type = 'U' THEN -- 唯一约束 tempStr := tempStr||' UNIQUE('||tempColStr||');'; END IF; dbms_output.put_line(tempStr); END LOOP; END makcon; -- -- 生成创建视图的SQL文件 -- PROCEDURE makview IS i INTEGER; BEGIN dbms_output.enable(9E38); -- 输出sql文件说明信息 dbms_output.put_line(chr(10)||chr(10)||'REM create view''s sql'); dbms_output.put_line('REM database user name:'||user); dbms_output.put_line('REM outputTime:'||sysdate); -- 查询用户的所有的表 FOR curview IN( SELECT a.view_name,a.text,b.comments comments FROM user_views A,user_tab_comments b WHERE a.view_name = b.table_name AND b.table_type = 'VIEW' ORDER BY a.view_name) LOOP -- 输出表信息 dbms_output.put_line(chr(10)||'DROP VIEW '||curview.view_name||';'); dbms_output.put_line('-- 视图名:'||curview.view_name); dbms_output.put_line('-- 备注:'||curview.comments); dbms_output.put_line('CREATE VIEW '||curview.view_name||' AS '); dealline(curview.text||';'); END LOOP; dbms_output.put_line(chr(10)||chr(10)); END makview; -- -- 生成创建序列的SQL文件 -- PROCEDURE makseq IS tempStr VARCHAR2(4000); BEGIN dbms_output.enable(9E38); -- 输出sql文件说明信息 dbms_output.put_line('REM create sequence''s sql'); dbms_output.put_line('REM database user name:'||user); dbms_output.put_line('REM outputTime:'||sysdate); -- 查询用户的所有的表 FOR curseq IN(select * from seq) LOOP dbms_output.put_line('DROP SEQUENCE '||curseq.sequence_name||';'); tempStr := 'CREATE SEQUENCE '||curseq.sequence_name; IF curseq.min_value IS NULL THEN tempStr := tempStr||' NOMINVALUE '; ELSE tempStr := tempStr||' MINVALUE '||curseq.min_value; END IF; IF curseq.max_value IS NULL THEN tempStr := tempStr||' NOMAXVALUE '; ELSE tempStr := tempStr||' MAXVALUE '||curseq.max_value; END IF; tempStr := tempStr||' INCREMENT_BY '||curseq.increment_by; tempStr := tempStr||' STRART_WITH '||curseq.last_number; IF curseq.cycle_flag = 'Y' THEN tempStr := tempStr||' CYCLE '; ELSE tempStr := tempStr||' NOCYCLE '; END IF; IF curseq.order_flag = 'Y' THEN tempStr := tempStr||' ORDER '; ELSE tempStr := tempStr||' NOORDER '; END IF; IF curseq.cache_size IS NULL THEN tempStr := tempStr||' NOCACHE '; ELSE tempStr := tempStr||' CACHE '||curseq.cache_size||' '; END IF; dbms_output.put_line(tempStr||';'); END LOOP; dbms_output.put_line(chr(10)||chr(10)); END makseq; END srcmake; / set feedback off set serveroutput on set linesize 255 spool &文件名 exec srcmake.maktab exec srcmake.makview exec srcmake.makseq spool off set serveroutput off set feedback on set linesize 80 drop package srcmake /
个人还是喜欢用 PLSQLDev中的EXPORT USER OBJECTS工具。一次操作就可以所有的对象。
dbms_metadata.get_ddl(object_type,object_name,object_owner)。
其中object_type:表示要获得 ddl 语句对象的类型,如:table,index 等
object_name:表示要获得 ddl 语句对象的名称
object_owner:表示要获得 ddl 语句对象的所有者
REM author: 朱伟民, time:15:20 01-8-4
REM 版权 :sinosoft
REM version:1.0
REM 从 oracle8i Enterprise Edition 数据库生成创建对象的脚本文件
REM --
-- 包头定义
--
CREATE OR REPLACE PACKAGE srcmake AS
PROCEDURE maktab;
PROCEDURE makview;
PROCEDURE makseq;
PROCEDURE makcon(tabName VARCHAR2);
END srcmake;
/ --
-- 包体定义
--
CREATE OR REPLACE PACKAGE BODY srcmake AS
--
-- 处理超过255个字符的行的输出
--
PROCEDURE dealline(initStr VARCHAR2) IS
lineCount INTEGER;
i INTEGER;
BEGIN
lineCount := ceil(length(initStr)/255);
FOR i IN 1..lineCount LOOP
dbms_output.put_line(substr(initStr,1 + 255 * (i - 1),255));
END LOOP;
END dealline; --
-- 生成创建表的SQL文件
--
PROCEDURE maktab IS
tempStr varchar2(4000);
countNum integer;
i integer;
BEGIN
dbms_output.enable(9E38); -- 输出sql文件说明信息
dbms_output.put_line('REM create table''s sql');
dbms_output.put_line('REM database user name:'||user);
dbms_output.put_line('REM outputTime:'||sysdate); -- 查询用户的所有的表
FOR curtab IN(
SELECT a.table_name table_name,a.tablespace_name,b.comments comments
FROM user_tables A,user_tab_comments b
WHERE a.table_name = b.table_name AND b.table_type = 'TABLE'
ORDER BY a.table_name)
LOOP
-- 输出表信息
dbms_output.put_line(chr(10)||'DROP TABLE '||curtab.table_name||';');
dbms_output.put_line('-- 表名:'||curtab.table_name);
dbms_output.put_line('-- 备注:'||curtab.comments);
dbms_output.put_line('CREATE TABLE '||curtab.table_name||'('); SELECT count(column_name) INTO countNum FROM user_tab_columns
WHERE table_name = curtab.table_name;
i := 0; -- 查询表所有的列
FOR curcol IN(
SELECT a.*,b.comments
FROM user_tab_columns a,user_col_comments b
WHERE a.table_name = curtab.table_name AND a.table_name = b.table_name
AND a.column_name = b.column_name ORDER BY column_id)
LOOP
tempStr := chr(9)||rpad(curcol.column_name,31,' ')||curcol.data_type; -- 以下类型需要指定长度
IF curcol.data_type IN('VARCHAR2','CHAR','VARCHAR','RAW') THEN
tempStr := tempStr||'('||curcol.data_length||')'; -- 数字类型存在精度问题
ELSIF curcol.data_type = 'NUMBER' THEN
IF curcol.data_precision IS NOT NULL THEN
tempStr := tempStr||'('||curcol.data_precision;
IF curcol.data_scale IS NOT NULL THEN
tempStr := tempStr||','||curcol.data_scale||')';
ELSE
tempStr := tempStr||')';
END IF;
ELSIF curcol.data_scale = 0 THEN
tempStr := tempStr||'(38)';
END IF;
END IF;
-- LONG,LONG RAW,CLOB,NLOB,BLOB,ROWID类型不需指定长度 IF curcol.nullable = 'N' THEN -- 指定非空标志
tempStr := tempStr||' NOT NULL';
END IF;
i := i + 1; -- 最后一列不需逗号
IF i != countNum THEN
tempStr := tempStr||',';
END IF; -- 输出列的信息
IF curcol.comments IS NOT NULL THEN
dbms_output.put_line(rpad(tempStr,60,' ')||'-- '||curcol.comments);
ELSE
dbms_output.put_line(tempStr);
END IF;
END LOOP; -- 输出表空间信息
dbms_output.put_line(') TABLESPACE '||curtab.tablespace_name||';'); -- 输出表约束
makcon(curtab.table_name);
END LOOP;
dbms_output.put_line(chr(10)||chr(10));
END maktab; --
-- 生成表的约束(primary key,foreign key)
-- parameter:tabName表名称
PROCEDURE makcon(tabName VARCHAR2) IS
tempStr VARCHAR2(4000);
tempColStr VARCHAR2(2000);
BEGIN
FOR curcon IN(
SELECT owner,constraint_name name,constraint_type type,
r_constraint_name rname,delete_rule,r_owner,table_name
FROM user_constraints WHERE table_name = tabName AND constraint_type IN('P','R','U'))
LOOP
-- 输出约束信息
tempStr := 'ALTER TABLE '||tabName||' ADD CONSTRAINTS '||curcon.name; FOR curcol IN(SELECT column_name FROM user_cons_columns
WHERE constraint_name = curcon.name) LOOP
tempColStr := tempColStr||curcol.column_name||',';
END LOOP;
tempColStr := substr(tempColStr,0,length(tempColStr) - 1); -- 输出约束的列信息
IF curcon.type = 'P' THEN -- 主键
tempStr := tempStr||' PRIMARY KEY('||tempColStr||');';
ELSIF curcon.type = 'R' THEN -- 外键
tempStr := tempStr||' FOREIGN KEY('||tempColStr||') '||chr(10);
tempStr := tempStr||' REFERENCES '||curcon.r_owner||'.'||curcon.table_name||'('||tempColStr||') ';
tempStr := tempStr||curcon.delete_rule||';';
ELSIF curcon.type = 'U' THEN -- 唯一约束
tempStr := tempStr||' UNIQUE('||tempColStr||');';
END IF;
dbms_output.put_line(tempStr);
END LOOP;
END makcon; --
-- 生成创建视图的SQL文件
--
PROCEDURE makview IS
i INTEGER;
BEGIN
dbms_output.enable(9E38);
-- 输出sql文件说明信息
dbms_output.put_line(chr(10)||chr(10)||'REM create view''s sql');
dbms_output.put_line('REM database user name:'||user);
dbms_output.put_line('REM outputTime:'||sysdate); -- 查询用户的所有的表
FOR curview IN(
SELECT a.view_name,a.text,b.comments comments
FROM user_views A,user_tab_comments b
WHERE a.view_name = b.table_name AND b.table_type = 'VIEW'
ORDER BY a.view_name)
LOOP
-- 输出表信息
dbms_output.put_line(chr(10)||'DROP VIEW '||curview.view_name||';');
dbms_output.put_line('-- 视图名:'||curview.view_name);
dbms_output.put_line('-- 备注:'||curview.comments);
dbms_output.put_line('CREATE VIEW '||curview.view_name||' AS ');
dealline(curview.text||';');
END LOOP;
dbms_output.put_line(chr(10)||chr(10));
END makview; --
-- 生成创建序列的SQL文件
--
PROCEDURE makseq IS
tempStr VARCHAR2(4000);
BEGIN
dbms_output.enable(9E38);
-- 输出sql文件说明信息
dbms_output.put_line('REM create sequence''s sql');
dbms_output.put_line('REM database user name:'||user);
dbms_output.put_line('REM outputTime:'||sysdate); -- 查询用户的所有的表
FOR curseq IN(select * from seq) LOOP
dbms_output.put_line('DROP SEQUENCE '||curseq.sequence_name||';');
tempStr := 'CREATE SEQUENCE '||curseq.sequence_name;
IF curseq.min_value IS NULL THEN
tempStr := tempStr||' NOMINVALUE ';
ELSE
tempStr := tempStr||' MINVALUE '||curseq.min_value;
END IF;
IF curseq.max_value IS NULL THEN
tempStr := tempStr||' NOMAXVALUE ';
ELSE
tempStr := tempStr||' MAXVALUE '||curseq.max_value;
END IF;
tempStr := tempStr||' INCREMENT_BY '||curseq.increment_by;
tempStr := tempStr||' STRART_WITH '||curseq.last_number;
IF curseq.cycle_flag = 'Y' THEN
tempStr := tempStr||' CYCLE ';
ELSE
tempStr := tempStr||' NOCYCLE ';
END IF;
IF curseq.order_flag = 'Y' THEN
tempStr := tempStr||' ORDER ';
ELSE
tempStr := tempStr||' NOORDER ';
END IF;
IF curseq.cache_size IS NULL THEN
tempStr := tempStr||' NOCACHE ';
ELSE
tempStr := tempStr||' CACHE '||curseq.cache_size||' ';
END IF;
dbms_output.put_line(tempStr||';');
END LOOP;
dbms_output.put_line(chr(10)||chr(10));
END makseq; END srcmake;
/ set feedback off
set serveroutput on
set linesize 255
spool &文件名
exec srcmake.maktab
exec srcmake.makview
exec srcmake.makseq
spool off
set serveroutput off
set feedback on
set linesize 80
drop package srcmake
/
具体的参数如下:
关键字 说明(默认)
---------------------------------------------------
USERID 用户名/口令
FULL 导出整个文件 (N)
BUFFER 数据缓冲区的大小
OWNER 所有者用户名列表
FILE 输出文件 (EXPDAT.DMP)
TABLES 表名列表
COMPRESS 导入一个范围 (Y)
RECORDLENGTH IO 记录的长度
GRANTS 导出权限 (Y)
INCTYPE 增量导出类型
INDEXES 导出索引 (Y)
RECORD 跟踪增量导出 (Y)
ROWS 导出数据行 (Y)
PARFILE 参数文件名
CONSTRAINTS 导出限制 (Y)
CONSISTENT 交叉表一致性
LOG 屏幕输出的日志文件
STATISTICS 分析对象 (ESTIMATE)
DIRECT 直接路径 (N)
TRIGGERS 导出触发器 (Y)
FEEDBACK 显示每 x 行 (0) 的进度
FILESIZE 各转储文件的最大尺寸
QUERY 选定导出表子集的子句导入用imp语句:
参数如下:
USERID 必须是命令行中的第一个参数。关键字 说明(默认)
----------------------------------------------
USERID 用户名/口令
FULL 导入整个文件 (N)
BUFFER 数据缓冲区大小
FROMUSER 所有人用户名列表
FILE 输入文件 (EXPDAT.DMP)
TOUSER 用户名列表
SHOW 只列出文件内容 (N)
TABLES 表名列表
IGNORE 忽略创建错误 (N)
RECORDLENGTH IO 记录的长度
GRANTS 导入权限 (Y)
INCTYPE 增量导入类型
INDEXES 导入索引 (Y)
COMMIT 提交数组插入 (N)
ROWS 导入数据行 (Y)
PARFILE 参数文件名
LOG 屏幕输出的日志文件
CONSTRAINTS 导入限制 (Y)
DESTROY 覆盖表空间数据文件 (N)
INDEXFILE 将表/索引信息写入指定的文件
SKIP_UNUSABLE_INDEXES 跳过不可用索引的维护 (N)
ANALYZE 执行转储文件中的 ANALYZE 语句 (Y)
FEEDBACK 显示每 x 行 (0) 的进度
TOID_NOVALIDATE 跳过指定类型 id 的校验
FILESIZE 各转储文件的最大尺寸
RECALCULATE_STATISTICS 重新计算统计值 (N)下列关键字仅用于可传输的表空间
TRANSPORT_TABLESPACE 导入可传输的表空间元数据 (N)
TABLESPACES 将要传输到数据库的表空间
DATAFILES 将要传输到数据库的数据文件
TTS_OWNERS 拥有可传输表空间集中数据的用户
谢谢大家。我只是想把问题简单化,原来越搞越复杂。
导出dmp,一个批处理就可以做; 可是导出一个用户全部对象的sql文件还得这么麻烦, 大家还有什么好的方法没有?