- createorreplaceprocedureprint_insert(v_tnamevarchar2,
- v_cbatchnumberdefault0)
- /*
- v_tname要输出sql的表名
- v_cbatch输出commit间隔
- */
- as
- /*声明动态游标变量*/
- typecur_alldataisrefcursor;
- l_alldatacur_alldata;
- /*将单行数据写入v_row*/
- v_sqlvarchar2(3999);
- v_rowvarchar2(3999);
- /*函数的前向声明*/
- functionformatfield(v_tnamevarchar2,v_cnamevarchar2,v_colnonumber)
- returnvarchar2;
- /*格式化数据输出*/
- functionformatdata(v_tnamevarchar2,v_rowvarchar2)returnvarchar2as
- v_ldatavarchar2(32765);
- v_rdatavarchar2(32765);
- v_cnamevarchar2(3999);
- v_instrnumber(10);
- v_countnumber(6);
- begin
- v_instr:=instr(v_row,'(',1,2);--INSTR(源字符串,目标字符串,起始位置,匹配序号)
- v_ldata:=substr(v_row,1,v_instr);
- v_rdata:=substr(v_row,v_instr+1);
- v_instr:=instr(v_rdata,')',-1,1);
- v_rdata:=substr(v_rdata,1,v_instr-1);
- v_count:=0;
- loop
- v_instr:=instr(v_rdata,',');
- exitwhenv_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*/
- ifv_count=1then
- v_ldata:=v_ldata||v_cname;
- else
- v_ldata:=v_ldata||','||v_cname;
- endif;
- endloop;
- /*添加最后一个字段的值*/
- ifv_count=1then
- 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)||');';
- endif;
- dbms_output.put_line(v_ldata);
- returnv_ldata;
- end;
- /*针对不同的数据类型进行处理*/
- functionformatfield(v_tnamevarchar2,v_cnamevarchar2,v_colnonumber)
- returnvarchar2as
- v_namevarchar2(3999);
- v_typevarchar2(99);
- begin
- selectcoltype
- intov_type
- fromcol
- wheretname=upper(v_tname)
- andcolno=v_colno;
- --判断数据类型
- ifv_type='DATE'then
- v_name:='to_date('||''''||v_cname||''''||','||''''||
- 'yyyy-mm-ddhh24:mi:ss'||''''||')';
- elsifv_type='VARCHAR2'then
- v_name:=''''||v_cname||'''';
- elsifv_type='CHAR'then
- v_name:=''''||v_cname||'''';
- else
- v_name:=v_cname;
- endif;
- returnv_name;
- end;
- /*求输入表的字段列表*/
- functiongetfields(v_tnamevarchar2)returnvarchar2as
- v_fieldsvarchar2(3999);
- v_fieldNamevarchar2(3999);
- begin
- forcur_fnamein(selectcname,coltype
- fromcol
- wheretname=upper(v_tname)
- orderbycolno)loop
- ifv_fieldsisnullthen
- v_fields:='nvl('||cur_fname.cname||','||''''||'0'||''''||')';
- else
- v_fields:=v_fields||'||'',''||'||'nvl('||cur_fname.cname||','||''''||'0'||''''||')';
- endif;
- ifv_fieldNameisnullthen
- v_fieldName:=cur_fname.cname;
- else
- v_fieldName:=v_fieldName||','||cur_fname.cname;
- endif;
- endloop;
- v_fields:='select'||''''||'insertinto'||v_tname||'('||
- v_fieldName||')values('||''''||'||'||v_fields||'||'||''''||')'||''''||
- 'from'||v_tname;
- returnv_fields;
- end;
- begin
- DBMS_OUTPUT.ENABLE(buffer_size=>null);--解决PLSQLDeveloper出现ORU-10027:bufferoverflow,limitof10000bytes
- executeimmediate'altersessionsetnls_date_format='||''''||
- 'yyyy-mm-ddhh24:mi:ss'||'''';
- dbms_output.put_line('***表SQL输出***');
- v_sql:=getfields(v_tname);
- --dbms_output.put_line(v_sql);
- openl_alldataforv_sql;
- loop
- fetchl_alldata
- intov_row;
- exitwhenl_alldata%notfound;
- --dbms_output.put_line(v_row);
- dbms_output.put_line(formatdata(v_tname,v_row));
- ifmod(l_alldata%rowcount,v_cbatch)=0then
- dbms_output.put_line('commit;');
- endif;
- endloop;
- closel_alldata;
- end;
原博客:http://blog.itpub.net/xzh2000
对原作者的代码进行了相应的修改。
在命令行中执行:
- setserveroutputon;--设置服务器输出
- execprint_insert('表名',100);
--获取表的相关字段属性(相当于java反射获取对象属性)
select * from colwhere tname = upper('表名');