- 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(10);
- 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(' *** XX向你问好! *** ');
- 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;
set pagesize 0;
set linesize 100;
spool c:/data.sql
select 'insert into tblinfo values
( ' ' '||FID|| ' ' ', ' ' '||FNAME|| ' ' ', '||nvl(FAGE,0) '); '
from tblinfo;
spool off;
提供一Perl程序 record2insert.pl
实施步骤
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();
下面介绍Oracle导出SQL脚本的实现方法。本方法使用spool。
a. 获取单个的建表和建索引的语法
1.set heading off;
2.set echo off;
3.Set pages 999;
4.set long 90000;
5.
6.spool DEPT.sql
7.select dbms_metadata.get_ddl('TABLE','DEPT','SCOTT') from dual;
8.select dbms_metadata.get_ddl('INDEX','DEPT_IDX','SCOTT') from dual;
9.spool off;
b.获取一个SCHEMA下的所有建表和建索引的语法,以scott为例:
1.set pagesize 0
2.set long 90000
3.
4.set feedback off
5.
6.set echo off
7.spool scott_schema.sql
8.connect scott/tiger;
9.SELECT DBMS_METADATA.GET_DDL('TABLE',u.table_name)
10. FROM USER_TABLES u;
11.SELECT DBMS_METADATA.GET_DDL('INDEX',u.index_name)
12. FROM USER_INDEXES u;
13.spool off;
c. 获取某个SCHEMA的建全部存储过程的语法
1.connect brucelau /brucelau;
2.
3.spool procedures.sql
4.
5.select
6. DBMS_METADATA.GET_DDL('PROCEDURE',u.object_name)
7.from
8. user_objects u
9.
10.where
11. object_type = 'PROCEDURE';
12.
13.spool off;
另:
1.dbms_metadata.get_ddl('TABLE','TAB1','USER1')
三个参数中,第一个指定导出DDL定义的对象类型(此例中为表类型),第二个是对象名(此例中即表名),第三个是对象所在的用户名。
要自己写程序进行Oracle导出SQL脚本,执行一段SQL,让SQL查询结果就是我们想要的SQL脚本:
如下:
1.select
2. 'INSERT INTO B_STATTEMPLATE ( N_ID,C_NAME, C_KBH, N_PRINT, N_TYPE, N_APP, N_VALID ) '
3. || 'Values (' || To_Char(N_ID) ||',''' || C_NAME || ''', ''' || C_KBH || ''', '
4. || To_Char( N_PRINT ) || ', ' || To_Char( N_TYPE ) || ', ' || '0, 0 );'
5. from b_stattemplate
6.
将查询结果保存起来就可以了!
Oracle导出SQL脚本这样就实现了