oracle导出表insert语句存储过程

本文介绍了一个使用PL/SQL编写的存储过程,该过程能够根据指定的表名自动生成INSERT语句,并允许设置每批提交的数据量。通过调用此过程,可以方便地为Oracle数据库中的表批量插入数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Sql代码 收藏代码
  1. createorreplaceprocedureprint_insert(v_tnamevarchar2,
  2. v_cbatchnumberdefault0)
  3. /*
  4. v_tname要输出sql的表名
  5. v_cbatch输出commit间隔
  6. */
  7. as
  8. /*声明动态游标变量*/
  9. typecur_alldataisrefcursor;
  10. l_alldatacur_alldata;
  11. /*将单行数据写入v_row*/
  12. v_sqlvarchar2(3999);
  13. v_rowvarchar2(3999);
  14. /*函数的前向声明*/
  15. functionformatfield(v_tnamevarchar2,v_cnamevarchar2,v_colnonumber)
  16. returnvarchar2;
  17. /*格式化数据输出*/
  18. functionformatdata(v_tnamevarchar2,v_rowvarchar2)returnvarchar2as
  19. v_ldatavarchar2(32765);
  20. v_rdatavarchar2(32765);
  21. v_cnamevarchar2(3999);
  22. v_instrnumber(10);
  23. v_countnumber(6);
  24. begin
  25. v_instr:=instr(v_row,'(',1,2);--INSTR(源字符串,目标字符串,起始位置,匹配序号)
  26. v_ldata:=substr(v_row,1,v_instr);
  27. v_rdata:=substr(v_row,v_instr+1);
  28. v_instr:=instr(v_rdata,')',-1,1);
  29. v_rdata:=substr(v_rdata,1,v_instr-1);
  30. v_count:=0;
  31. loop
  32. v_instr:=instr(v_rdata,',');
  33. exitwhenv_instr=0;
  34. v_cname:=substr(v_rdata,1,v_instr-1);
  35. v_rdata:=substr(v_rdata,v_instr+1);
  36. v_count:=v_count+1;
  37. /*格式化不同的数据类型*/
  38. v_cname:=formatfield(v_tname,v_cname,v_count);
  39. /*将处理后的字段值加入v_ldata*/
  40. ifv_count=1then
  41. v_ldata:=v_ldata||v_cname;
  42. else
  43. v_ldata:=v_ldata||','||v_cname;
  44. endif;
  45. endloop;
  46. /*添加最后一个字段的值*/
  47. ifv_count=1then
  48. v_ldata:=v_ldata||formatfield(v_tname,v_rdata,v_count+1)||');';
  49. else
  50. v_ldata:=v_ldata||','||
  51. formatfield(v_tname,v_rdata,v_count+1)||');';
  52. endif;
  53. dbms_output.put_line(v_ldata);
  54. returnv_ldata;
  55. end;
  56. /*针对不同的数据类型进行处理*/
  57. functionformatfield(v_tnamevarchar2,v_cnamevarchar2,v_colnonumber)
  58. returnvarchar2as
  59. v_namevarchar2(3999);
  60. v_typevarchar2(99);
  61. begin
  62. selectcoltype
  63. intov_type
  64. fromcol
  65. wheretname=upper(v_tname)
  66. andcolno=v_colno;
  67. --判断数据类型
  68. ifv_type='DATE'then
  69. v_name:='to_date('||''''||v_cname||''''||','||''''||
  70. 'yyyy-mm-ddhh24:mi:ss'||''''||')';
  71. elsifv_type='VARCHAR2'then
  72. v_name:=''''||v_cname||'''';
  73. elsifv_type='CHAR'then
  74. v_name:=''''||v_cname||'''';
  75. else
  76. v_name:=v_cname;
  77. endif;
  78. returnv_name;
  79. end;
  80. /*求输入表的字段列表*/
  81. functiongetfields(v_tnamevarchar2)returnvarchar2as
  82. v_fieldsvarchar2(3999);
  83. v_fieldNamevarchar2(3999);
  84. begin
  85. forcur_fnamein(selectcname,coltype
  86. fromcol
  87. wheretname=upper(v_tname)
  88. orderbycolno)loop
  89. ifv_fieldsisnullthen
  90. v_fields:='nvl('||cur_fname.cname||','||''''||'0'||''''||')';
  91. else
  92. v_fields:=v_fields||'||'',''||'||'nvl('||cur_fname.cname||','||''''||'0'||''''||')';
  93. endif;
  94. ifv_fieldNameisnullthen
  95. v_fieldName:=cur_fname.cname;
  96. else
  97. v_fieldName:=v_fieldName||','||cur_fname.cname;
  98. endif;
  99. endloop;
  100. v_fields:='select'||''''||'insertinto'||v_tname||'('||
  101. v_fieldName||')values('||''''||'||'||v_fields||'||'||''''||')'||''''||
  102. 'from'||v_tname;
  103. returnv_fields;
  104. end;
  105. begin
  106. DBMS_OUTPUT.ENABLE(buffer_size=>null);--解决PLSQLDeveloper出现ORU-10027:bufferoverflow,limitof10000bytes
  107. executeimmediate'altersessionsetnls_date_format='||''''||
  108. 'yyyy-mm-ddhh24:mi:ss'||'''';
  109. dbms_output.put_line('***表SQL输出***');
  110. v_sql:=getfields(v_tname);
  111. --dbms_output.put_line(v_sql);
  112. openl_alldataforv_sql;
  113. loop
  114. fetchl_alldata
  115. intov_row;
  116. exitwhenl_alldata%notfound;
  117. --dbms_output.put_line(v_row);
  118. dbms_output.put_line(formatdata(v_tname,v_row));
  119. ifmod(l_alldata%rowcount,v_cbatch)=0then
  120. dbms_output.put_line('commit;');
  121. endif;
  122. endloop;
  123. closel_alldata;
  124. end;

原博客:http://blog.itpub.net/xzh2000

对原作者的代码进行了相应的修改。

在命令行中执行:

Sql代码 收藏代码
  1. setserveroutputon;--设置服务器输出
  2. execprint_insert('表名',100);

--获取表的相关字段属性(相当于java反射获取对象属性)

select * from colwhere tname = upper('表名');

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值