存储过程insert oracle,oracle用存储过程导出INSERT INTO 语句

前些天看到几个朋友做导出oracle中的数据,可以用PL/SQL Devoleper的和export tables功能批量将N个表的数据导出成insert into语句,但怎样用SQL语句导出呢,只有用sql构造出来,以下是我用存储过程实现的代码

create or replace package PK_EXPORT_TABLE  is  type result is ref cursor;end ;

CREATE OR REPLACE PROCEDURE P_EXPORT_TABLE(v_table in varchar,

cresult out PK_EXPORT_TABLE.result

--outstr out varchar2 /*测试SQL*/

)

/*----------------------------------------------------------------------------------------

功能要求:导出sql语名,格式为INSERT INTO TABLE(。。。)VALUES(。。。);

编写人:chimo

编写开始日期:   20080120

编写结束日期:20080120

参数定义:    表名v_table,cresult是一个自定义游标!

自定义游标:create or replace package PK_EXPORT_TABLE  is  type result is ref cursor;end PK_EXPORT_TABLE;

数据来源:

调用方法:其它语言中调用,PL/SQL过程中   如:EXEC p_xqcn_cycsjcx ('参数1');

-----------------------------------------------------------------------------------------*/

as

TYPE v_cur_tab_columns IS REF CURSOR;/*表各字段信息*/

v_tab_columns v_cur_tab_columns;

v_sql_columns varchar2(500);/*查询字段信息*/

v_column_infor user_tab_columns%rowtype; /*行字录各字段数型为USRE_TAB_COLUMNS*/

v_sqlstr_part_1 varchar2(200):='';/*存放形成sql的第一部分*/

v_sqlstr_part_2 varchar2(500):='';/*存放形成sql的第二部分*/

v_sqlstr_part_3 varchar2(4000):='';/*存放形成sql的第三部分*/

v_sql varchar2(5000):='';/*存放形成的sql*/

v_sqlneed varchar2(100):=','||''''||','||''''||','; /*形成在VALUES中的分隔符 ”, “ */

begin

v_sqlstr_part_1:='insert into '||upper(v_table)||' (';

/*查询表中各字段信息*/

v_sql_columns:='select * from user_tab_columns where table_name='||''''||UPPER(v_table)||''''||' AND data_type not in ('||''''||'BLOB'||''''||','||''''||'CLOB'||''''||') AND ROWNUM<20';

open  v_tab_columns for v_sql_columns;

loop

fetch v_tab_columns into v_column_infor;

exit when v_tab_columns%notfound;

/*用于形成insert into table (。。。)中的字段*/

v_sqlstr_part_2:=v_sqlstr_part_2||v_column_infor.COLUMN_NAME||',';

/*用于形成values (。。。)中的字段*/

v_sqlstr_part_3:=case

when v_column_infor.DATA_TYPE='DATE' THEN v_sqlstr_part_3||'to_date(to_char('||'BZRQ'||','||''''||'yyyy-mm-dd hh24:mi:ss'||''''||'), '||''''||'yyyy-mm-dd hh24:mi:ss'||''''||')'||v_sqlneed

when v_column_infor.DATA_TYPE='VARCHAR2' OR v_column_infor.DATA_TYPE='VARCHAR' or v_column_infor.DATA_TYPE='CHAR' THEN v_sqlstr_part_3||' case when '||v_column_infor.column_name||' IS NOT NULL THEN '||''''''''''||'||'||v_column_infor.COLUMN_NAME||'||'||''''''''''||' ELSE NULL END AS '||v_column_infor.COLUMN_NAME||v_sqlneed

when v_column_infor.DATA_TYPE='NUMBER' THEN v_sqlstr_part_3||' case when '||v_column_infor.column_name||' IS NOT NULL THEN '||v_column_infor.COLUMN_NAME||' ELSE NULL END AS '||v_column_infor.COLUMN_NAME||v_sqlneed

else

--v_sqlstr_part_3||' case when '||v_column_infor.column_name||' IS NOT NULL THEN '||''''''''''||'||'||v_column_infor.COLUMN_NAME||'||'||''''''''''||' ELSE NULL END AS '||v_column_infor.COLUMN_NAME||v_sqlneed

v_sqlstr_part_3||'NULL'||v_sqlneed

end;

end loop;

/*去掉最后的“,”并加上VALUES*/

v_sqlstr_part_2:=substr(v_sqlstr_part_2,0,length(v_sqlstr_part_2)-1)||') values (';

/*去掉最后的“,“*/

v_sqlstr_part_3:=substr(v_sqlstr_part_3,0,length(v_sqlstr_part_3)-5)||','||''')''';

/*形成的sql*/

v_sql:='SELECT '''||v_sqlstr_part_1||v_sqlstr_part_2||''''||','||v_sqlstr_part_3||' FROM '||upper(v_table)||' ';

/*打开游标并返回*/

open cresult for v_sql;

Exception

when others then

open cresult for 'select * from '||v_table;

--outstr:=v_sql;

end P_EXPORT_TABLE;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值