免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 17534 | 回复: 11
打印 上一主题 下一主题

如何将Oracle表里的数据导出成insert into脚本? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-10-21 11:37 |只看该作者 |倒序浏览
在数据库开发的过程中创建了很多代码表,并且在代码表里插入了数据,现在我想做一个数据初始化脚本,以便移植到开发环境中.这样就需要建表脚本,还有代码表初始化脚本.前者可用ERWin反向工程解决,请问后者(将代码表的数据反向成一条条的insert into语句)该怎么解决?

论坛徽章:
0
2 [报告]
发表于 2005-10-21 12:09 |只看该作者

如何将Oracle表里的数据导出成insert into脚本?

呵呵,我知道了,可以用PL/SQL Devoleper的和export tables功能批量将N个表的数据导出成insert into语句.

论坛徽章:
0
3 [报告]
发表于 2005-10-22 15:35 |只看该作者

如何将Oracle表里的数据导出成insert into脚本?

能不能说详细点,我也想知道。 谢谢!

论坛徽章:
0
4 [报告]
发表于 2005-10-22 19:36 |只看该作者

如何将Oracle表里的数据导出成insert into脚本?

你可以试试SQL Navigator这个工具的,SELECT 出数据后直接保存,有选项的.好多工具都有这个功能的.中文工具 Object Browser也可以,很好用的.

论坛徽章:
0
5 [报告]
发表于 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.

论坛徽章:
0
6 [报告]
发表于 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;

论坛徽章:
0
7 [报告]
发表于 2005-10-24 15:57 |只看该作者

如何将Oracle表里的数据导出成insert into脚本?

toad比较方便

论坛徽章:
0
8 [报告]
发表于 2005-10-24 16:39 |只看该作者

如何将Oracle表里的数据导出成insert into脚本?

TOAD下载的地方比较少吧?

论坛徽章:
0
9 [报告]
发表于 2005-10-24 17:42 |只看该作者

如何将Oracle表里的数据导出成insert into脚本?

[quote]原帖由 "nees"]在数据库开发的过程中创建了很多代码表,并且在代码表里插入了数据,现在我想做一个数据初始化脚本,以便移植到开发环境中.这样就需要建表脚本,还有代码表初始化脚本.前者可用ERWin反向工程解决,请问后者(将代码表的数?.........[/quote 发表:

呵呵,可以使用spool 结合select 语句将表中的数据按你需要的格式输出啊!不用什么别的工具!

论坛徽章:
0
10 [报告]
发表于 2010-01-26 13:36 |只看该作者
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP