设为首页 收藏本站
查看: 734|回复: 0

[经验分享] oracle导出表insert语句存储过程

[复制链接]

尚未签到

发表于 2016-8-11 07:27:14 | 显示全部楼层 |阅读模式
  
  

create or replace procedure print_insert(v_tname  varchar2,
v_cbatch number default 0)
/*
v_tname 要输出sql的表名
v_cbatch 输出commit间隔
*/
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, '(', 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, ',');
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;
dbms_output.put_line(v_ldata);
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 || '''';
elsif v_type = 'CHAR' 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);
v_fieldName 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;
if v_fieldName is null then
v_fieldName := cur_fname.cname;
else
v_fieldName := v_fieldName || ',' || cur_fname.cname;
end if;
end loop;
v_fields := 'select ' || '''' || 'insert into ' || v_tname || ' (' ||
v_fieldName || ') values(' || '''' || '||' || v_fields || '||' || '''' || ')' || '''' ||
' from ' || v_tname;
return v_fields;
end;
begin
DBMS_OUTPUT.ENABLE(buffer_size => null); --解决PLSQL Developer 出现ORU-10027: buffer overflow, limit of 10000 bytes
execute immediate 'alter session set nls_date_format=' || '''' ||
'yyyy-mm-dd hh24:mi:ss' || '''';
dbms_output.put_line(' *** 表SQL输出 *** ');
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;
  
  原博客:http://blog.itpub.net/xzh2000
  对原作者的代码进行了相应的修改。
  
  在命令行中执行:
  

set serveroutput on; --设置服务器输出
exec print_insert('表名',100);
  
  
  --获取表的相关字段属性(相当于java反射获取对象属性)
  select * from col where tname = upper('表名');
  
  
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-256126-1-1.html 上篇帖子: Oracle Database SQL语句处理步骤 下篇帖子: JDBC Oracle 获取表字段名(转)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表