哦,不是这样的 table1 col1 col2 col3 ----------------------- aa bb cc dd ee ff需要转变成 table2 newcol1 ----------------------------------------------------------------- insert into tabl1 (col1,col2,col3) values(aa,bb,cc) insert into tabl1 (col1,col2,col3) values(dd,ee,ff)
insert into table2 select 'insert into table1(col1,col2,col3) values(' ||col1||','||col2||','||col3||')' from table1;
是想把数据转换成sql吗?直接拼字符串就行了select 'insert into table1(col1,col2,col3) values(' ||col1||','||col2||','||col3||')' from table1; 如果是字符类型两边加引号,如果是日期类型考虑用to_date函数。
但是如何在只知道表名的情况下实现呢? 我希望把它做的通用一点,我大概有50张表需要倒。最长的一张表有60多个的字段,还可能被修改,直接写的话...有点痛苦。 oracle有像sql server 里syscolumns这样的系统表吗?
SYS.USER_TAB_COLUMNS用这个视图,或者SYS.USER_TAB_COLS。
我对oracle 不太熟...如果或是sql server的话,因该可以这样 declare @head varchar(2000) declare @body varchar(2000)select @head = 'insert into ' + @tabname+'(',@body = '' select @head = @head + a.name + ', ' ,@body = @body + case when a.type in (63,50,55,62,56,60,63,52,122,48,37) then ' convert(varchar(10),' + a.name +')' +'+' +'''' +',' +''''+'+' when a.type in (47,39) then '''' +''''+''''+''''+ '+'+ a.name +'+' +'''' +''''+''''+'''' +'+' +'''' +',' +''''+'+' when a.type in (61,58) then '''' +''''+''''+''''+ '+'+ a.name +'+' +'''' +''''+''''+'''' +'+' +'''' +',' +''''+'+' end from dbo.syscolumns A where a.id = object_id(@tabname)select @head = @head + ') values (' select @body = 'select (' +''''+@head+''''+' +'+left(@body,len(@body) - 5) +''''+')'+''''+ ') as command from ' +@tabname --select @body--察看拼出来的sql语句 --exec (@body)--执行这个动态语句这个语句还有一点问题,就是对image等字段类型没有作判断,但不知道在oracle中如何实现?
对于简单的复制可用: insert into TEMP3(col1,col2,col3) SELECT col1,col2,col3 FROM TEMP2;可是如果需要不同的表呢?如何取得字段列表? 不同的表之间有关联吧,如有可这样: insert into TEMP4(COL1,COL2) SELECT bookinfo2.BOOKNAME, authorinfo2.HOMETOWN FROM bookinfo2 INNER JOIN authorinfo2 ON bookinfo2.AUTHORNAME = authorinfo2.AUTHORNAME;
table1
col1 col2 col3
-----------------------
aa bb cc
dd ee ff需要转变成
table2
newcol1
-----------------------------------------------------------------
insert into tabl1 (col1,col2,col3) values(aa,bb,cc)
insert into tabl1 (col1,col2,col3) values(dd,ee,ff)
select 'insert into table1(col1,col2,col3) values('
||col1||','||col2||','||col3||')' from table1;
||col1||','||col2||','||col3||')' from table1;
如果是字符类型两边加引号,如果是日期类型考虑用to_date函数。
我希望把它做的通用一点,我大概有50张表需要倒。最长的一张表有60多个的字段,还可能被修改,直接写的话...有点痛苦。
oracle有像sql server 里syscolumns这样的系统表吗?
declare @head varchar(2000)
declare @body varchar(2000)select @head = 'insert into ' + @tabname+'(',@body = ''
select @head = @head + a.name + ', ' ,@body = @body +
case when a.type in (63,50,55,62,56,60,63,52,122,48,37) then
' convert(varchar(10),' + a.name +')' +'+' +'''' +',' +''''+'+'
when a.type in (47,39) then
'''' +''''+''''+''''+ '+'+ a.name +'+' +'''' +''''+''''+'''' +'+' +'''' +',' +''''+'+'
when a.type in (61,58) then
'''' +''''+''''+''''+ '+'+ a.name +'+' +'''' +''''+''''+'''' +'+' +'''' +',' +''''+'+'
end
from dbo.syscolumns A
where a.id = object_id(@tabname)select @head = @head + ') values ('
select @body = 'select (' +''''+@head+''''+' +'+left(@body,len(@body) - 5) +''''+')'+''''+ ') as command from ' +@tabname --select @body--察看拼出来的sql语句
--exec (@body)--执行这个动态语句这个语句还有一点问题,就是对image等字段类型没有作判断,但不知道在oracle中如何实现?
insert into TEMP3(col1,col2,col3)
SELECT col1,col2,col3 FROM TEMP2;可是如果需要不同的表呢?如何取得字段列表?
不同的表之间有关联吧,如有可这样:
insert into TEMP4(COL1,COL2)
SELECT bookinfo2.BOOKNAME, authorinfo2.HOMETOWN
FROM bookinfo2 INNER JOIN authorinfo2
ON bookinfo2.AUTHORNAME = authorinfo2.AUTHORNAME;
比如
1、先建立空表
2、然后insert into 空表 select * from 旧表;
当然,不能有RAW,LONG,LOB类型的字段还有,你说的应该是希望把表里面的记录写成insert语句吧?
比如
SQL> select * from aa;NAME DD
-------- ----------
1 1.12
01 1.12变成
insert into aa values ('1',1.12);
insert into aa values ('1',1.12);是吧?
这也不难,写个小程序即可?
不过觉得意义不太大
我倒是写了一个,如果需要,可以给你。。
ATCG(novel gene)就写出来让大家学习学习吧
如果有那正是太感谢了了。
sql ce太讨厌,油烟不进。没办法,只能通过这种比较土的办法了。
实施步骤
1、先到www.activeperl.com去下载一个activeperl,免费的
2、安装perl
3、到\Perl\bin下面执行 ppm
4、出现PPM提示符如下
D:\Perl\bin>PPM
PPM interactive shell (2.1.6) - type 'help' for available commands.
PPM>
5、在PPM提示符下执行如下命令,安装数据库连接模块DBI,DBD
PPM>install dbi
PPM>install dbd-oracle
6、执行下面的perl程序即可,其中用户名和密码,以及连接字符串自己改改
再命令窗口直接键入如下命令格式,该程序无需编译,祝你好运
record2insert.pl >输出文件名.sql
7、该程序不支持RAW,LONG和LOB类型的字段
#!/usr/bin/perl -w
#author atgc
use DBI;
$dbh = DBI->connect("DBI:Oracle:连接名",'用户名','密码');
$sql = "select table_name from user_tables";
$sth1 = $dbh->prepare($sql);
$sth1->execute();
while($table_name = $sth1->fetchrow)
{
$sql = "select * from $table_name";
$sth2 = $dbh->prepare($sql);
$sth2->execute();
while(@field = $sth2->fetchrow)
{
$value="";
foreach $ele(@field){$ele.="";$ele=~s/'/''/;$value.=$ele."','";}
$value=~s/\,\'$//;
print "insert into $table_name values ('"."$value\);\n";
}
print "\n";
$sth2->finish();
}
$sth1->finish();
$dbh->disconnect();
会自动到perl站点下载数据的
EXP/IMP来实现,多方便呢?
database -> export -> table data ->OPTIONS 选中“include Schema/Owner name in insert statement
就可以了
现在的设计是把table data 导出后放到一个newtable中,在pda上读取newtable中的insertScript执行,把数据插入到sqlce中,所以要绕那么大一个圈子。
谢谢各位了,结帖