oracle用預存程序匯出INSERT INTO 語句

來源:互聯網
上載者:User

前些天看到幾個朋友做匯出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;

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.