Chinaunix

标题: 如何将Oracle表里的数据导出成insert into脚本? [打印本页]

作者: nees    时间: 2005-10-21 11:37
标题: 如何将Oracle表里的数据导出成insert into脚本?
在数据库开发的过程中创建了很多代码表,并且在代码表里插入了数据,现在我想做一个数据初始化脚本,以便移植到开发环境中.这样就需要建表脚本,还有代码表初始化脚本.前者可用ERWin反向工程解决,请问后者(将代码表的数据反向成一条条的insert into语句)该怎么解决?
作者: nees    时间: 2005-10-21 12:09
标题: 如何将Oracle表里的数据导出成insert into脚本?
呵呵,我知道了,可以用PL/SQL Devoleper的和export tables功能批量将N个表的数据导出成insert into语句.
作者: sunbin1113    时间: 2005-10-22 15:35
标题: 如何将Oracle表里的数据导出成insert into脚本?
能不能说详细点,我也想知道。 谢谢!
作者: fhk    时间: 2005-10-22 19:36
标题: 如何将Oracle表里的数据导出成insert into脚本?
你可以试试SQL Navigator这个工具的,SELECT 出数据后直接保存,有选项的.好多工具都有这个功能的.中文工具 Object Browser也可以,很好用的.
作者: sshd    时间: 2005-10-24 04:29
标题: 如何将Oracle表里的数据导出成insert into脚本?
exp/imp, expd/impd, tansportable tablespace, external tables, data guard, multimaster replication --- these are oracle solutions (from oracle db to oracle db)
if the target database is not oracle, it's possible to wrtie the "insert into" statements. the limitation is that if the table contains columns of data type raw, long raw, long, clob, nclob, blob etc, then this method will not work.
作者: ximcn    时间: 2005-10-24 11:42
标题: 如何将Oracle表里的数据导出成insert into脚本?
转载,请保留原作者的名字。


create or replace procedure print_insert(v_tname varchar2,v_cbatch number default 0)
/*
v_tname 要输出sql的表名 作者zh2000@hotmail.com
v_cbatch 输出commit间隔 博客:http://blog.itpub.net/xzh2000
*/
as
/* 声明动态游标变量 */
type cur_alldata is ref cursor;
l_alldata cur_alldata;
/* 将单行数据写入v_row*/
v_sql varchar2(3999);
v_row varchar2(3999);
/* 函数的前向声明 */
function formatfield(v_tname varchar2,v_cname varchar2,v_colno number) return varchar2;
/* 格式化数据输出 */
function formatdata(v_tname varchar2,v_row varchar2) return varchar2
as
v_ldata varchar2(32765);
v_rdata varchar2(32765);
v_cname varchar2(3999);
v_instr number(;
v_count number(6);
begin
v_instr := instr(v_row,'(');
v_ldata := substr(v_row,1,v_instr);
v_rdata := substr(v_row,v_instr+1);
v_instr := instr(v_rdata,')');
v_rdata := substr(v_rdata,1,v_instr-1);

v_count := 0;
loop
v_instr := instr(v_rdata,',');
exit when v_instr = 0;

v_cname := substr(v_rdata,1,v_instr-1);
v_rdata := substr(v_rdata,v_instr+1);
v_count := v_count + 1;
/* 格式化不同的数据类型 */
v_cname := formatfield(v_tname,v_cname,v_count);

/* 将处理后的字段值加入v_ldata */
if v_count = 1 then
v_ldata := v_ldata||v_cname;
else
v_ldata := v_ldata||','||v_cname;
end if;

end loop;

/* 添加最后一个字段的值 */
if v_count = 1 then
v_ldata := v_ldata||formatfield(v_tname,v_rdata,v_count+1)||');';
else
v_ldata := v_ldata||','||formatfield(v_tname,v_rdata,v_count+1)||');';
end if;
return v_ldata;
end;
/* 针对不同的数据类型进行处理 */
function formatfield(v_tname varchar2,v_cname varchar2,v_colno number) return varchar2
as
v_name varchar2(3999);
v_type varchar2(99);
begin
select coltype into v_type from col where tname = upper(v_tname) and colno = v_colno;
if v_type = 'DATE' then
v_name := 'to_date('||''''||v_cname||''''||','||''''||'yyyy-mm-dd hh24:mi:ss'||''''||')';
elsif v_type = 'VARCHAR2' then
v_name := ''''||v_cname||'''';
else
v_name := v_cname;
end if;
return v_name;
end;
/* 求输入表的字段列表 */
function getfields(v_tname varchar2) return varchar2
as
v_fields varchar2(3999);
begin
for cur_fname in (select cname,coltype from col where tname = upper(v_tname) order by colno) loop
if v_fields is null then
v_fields := 'nvl('||cur_fname.cname||','||''''||'0'||''''||')';
else
v_fields := v_fields||'||'',''||'||'nvl('||cur_fname.cname||','||''''||'0'||''''||')';
end if;
end loop;
v_fields := 'select '||''''||'insert into '||v_tname||' values('||''''||'||'||v_fields||'||'||''''||')'||''''||' from '||v_tname;
return v_fields;
end;
begin
execute immediate 'alter session set nls_date_format='||''''||'yyyy-mm-dd hh24:mi:ss'||'''';
dbms_output.put_line(' *** xzxh2000向你问好! *** ');

v_sql := getfields(v_tname);
--dbms_output.put_line(v_sql);
open l_alldata for v_sql;
loop
fetch l_alldata into v_row;
exit when l_alldata%notfound;
--dbms_output.put_line(v_row);

dbms_output.put_line(formatdata(v_tname,v_row));
if mod(l_alldata%rowcount,v_cbatch) = 0 then
dbms_output.put_line('commit;');
end if;
end loop;

close l_alldata;
end;
作者: macrodba    时间: 2005-10-24 15:57
标题: 如何将Oracle表里的数据导出成insert into脚本?
toad比较方便
作者: nees    时间: 2005-10-24 16:39
标题: 如何将Oracle表里的数据导出成insert into脚本?
TOAD下载的地方比较少吧?
作者: 西藏喇嘛    时间: 2005-10-24 17:42
标题: 如何将Oracle表里的数据导出成insert into脚本?
[quote]原帖由 "nees"]在数据库开发的过程中创建了很多代码表,并且在代码表里插入了数据,现在我想做一个数据初始化脚本,以便移植到开发环境中.这样就需要建表脚本,还有代码表初始化脚本.前者可用ERWin反向工程解决,请问后者(将代码表的数?.........[/quote 发表:

呵呵,可以使用spool 结合select 语句将表中的数据按你需要的格式输出啊!不用什么别的工具!
作者: bikachu    时间: 2010-01-26 13:36

作者: bikachu    时间: 2010-01-26 13:37
(  
good cases.
作者: renxiao2003    时间: 2010-01-26 21:25
用工具是可以的。如PLSQL DEVELOPER和DATA STUDIO




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2