学习oracle技术,每天学一点,每天进步一点

用存储过程把表里的数据导成insert语句

上一篇 / 下一篇  2008-06-11 21:25:04 / 个人分类:pl/sql

SQL> show parameters utl_file_dir;
ub+Tx!FE&BT0ITPUB个人空间3v#{e h6gL
可以看到该参数的当前设置。ITPUB个人空间"DZ&k%?5b(l}

6Oq(~~#wf^/Rfhi)z0如果没有值,必须修改数据库的initsid.ora文件,将utl_file_dir 指向一个你想用PL/SQL file I/O 的路径。ITPUB个人空间^ _bQ m7i0l.]+l
重新启动数据库。此参数才生效。
#`N oMAuD0
+Cj3W b^O\0调用它,可以把表里的数据生成(insert into 表名 ....)OS下文件的过程genins_file方法:
0uL!j-];bU0
r)K8bhW!U},C0        SQL>exec genins_file('emp','/oracle/logs','insert_emp.sql');  
H"?sb Uh Z0                                            |         |                |ITPUB个人空间)N S0r xnv8ALdI Q
                                       表名,可变     |         生成OS下文件名,可变  ITPUB个人空间p?+i-U3_ {A3R
                                         |ITPUB个人空间;KT0Je+m1?R5w
                                utl_file_dir路径名,不变(我设置的是/oracle/logs)    
/aX:knL^L0
'R-N ]-Vi-?(D._8_*@&Z |0存储过程原码
'xSvt_0cw){0CREATE OR REPLACE PROCEDURE genins_file(ITPUB个人空间4Tq\xP\4A
p_table  IN varchar2,
v;t'~;CDt'd A0p_output_folder IN VARCHAR2,ITPUB个人空间7q:f ](v!y4a:C
p_output_file   IN VARCHAR2)ITPUB个人空间:bk5pfD!dE
IS
[8J8J| K C+t0  --
W?(w@az,w?+C7z0  l_column_list    VARCHAR2(32767);
?v{9\.j0E0  l_value_list     VARCHAR2(32767);ITPUB个人空间yV+lFP7o5\f ?z
  l_query          VARCHAR2(32767);
T@k5SK6~C0  l_cursor         NUMBER;
RZ\-l a(cw0  ignore   NUMBER;ITPUB个人空间,q3S/k.Qi;K'FN+} I$P)U1L
  l_insertline1    varchar2(32767);
)x f k%d2yHN0  l_insertline2    varchar2(32767);  ITPUB个人空间*rPh(rj(K4EQ
  cmn_file_handle       UTL_FILE.file_type;
4IDA[,Ou0  --ITPUB个人空间3?*J"P1M$x j
  FUNCTION get_cols(p_table VARCHAR2)ITPUB个人空间p)IjrU
  RETURN VARCHAR2ITPUB个人空间+Sk,J%w6VX9Z
  IS
W5q`.q_0O}0    l_cols VARCHAR2(32767);
u}5?;Py(c h0    CURSOR l_col_cur(c_table VARCHAR2) IS
l!w#a]7w hw0            SELECT column_name
:yT6c"Tk0            FROM   user_tab_columns
)\]vHVmx|&v#_0            WHERE  table_name = upper(c_table)ITPUB个人空间Jv`kvTz
            ORDER BY column_id;ITPUB个人空间gQ(|#M:b;Is0]2u
  BEGIN
GH!_4TMAU0    l_cols := null;
vVc,go0\.SL0    FOR rec IN l_col_cur(p_table)
L%ab3pOX{0    LOOP
7J@lB.f,|D!Ci#b0      l_cols := l_cols || rec.column_name || ',';
a&^G+Cn8y0    END LOOP;ITPUB个人空间9^){8d%{"Z"MZ2W4]
    RETURN substr(l_cols,1,length(l_cols)-1);
:D9|;w!ZZv]yG{x0  END;
+p w.]&F:u.TxP0  --
C2g*}$Mom0  FUNCTION get_query(p_table IN VARCHAR2)ITPUB个人空间q6?:jM ih
  RETURN VARCHAR2
$aV7G0B!I/n&F]0  IS
'd6rk0U%Mu m,e$i0    l_query VARCHAR2(32767);ITPUB个人空间R's!h3[`` L
      CURSOR l_query_cur(c_table VARCHAR2) ISITPUB个人空间2~5Lu&i [~"y:H*_
        SELECT 'decode('||column_name||',null,''null'','||
d|0l\9G0iQ0               decode(data_type,'VARCHAR2','''''''''||'||column_name ||'||'''''''''ITPUB个人空间l:js;\+P
               ,'DATE','''''''''||to_char('||column_name||',''YYYY-MM-DD HH24:MI:SS'')||'''''''''
y,l(}FkU?0               ,column_name
)R c7]+ed"A0               ) || ')' column_queryITPUB个人空间^$q1BD Y)l I
          FROM user_tab_columns
,Ln*AD[Y"] W0         WHERE table_name = upper(c_table)ITPUB个人空间Y/uS(j,H(i,g1Nm3BP
        ORDER BY column_id;ITPUB个人空间7C [7jYH!S s1?O
  BEGINITPUB个人空间9YEnk4@.j
    l_query := 'SELECT ';
7o:T'i BK&o(A ?0    FOR rec IN l_query_cur(p_table)ITPUB个人空间HQ"T5i0k;Ha8W[d
    LOOPITPUB个人空间3Iu2`!^W hM3lc
      l_query := l_query || rec.column_query || '||'',''||';ITPUB个人空间/m VMRm)g8Q1h4C8N,wbs
    END LOOP;
/v7yen!xxK3p^#H0    l_query := substr(l_query,1,length(l_query)-7);
DGh'vhe*l0    RETURN l_query || ' FROM ' || p_table;
I%cYd7i3W2N/tBj0  END;
;cKW? qB0  --ITPUB个人空间'kI;w8z.t9Cdj/xi%]
BEGIN
ZaJy&W mR"Tu"pL0  l_column_list  := get_cols(p_table);
,@wg5T#\cL\D~0  l_query        := get_query(p_table);
O6smnM0  l_cursor := dbms_sql.open_cursor;
'jt8vE2GQo4F`0  DBMS_SQL.PARSE(l_cursor, l_query, DBMS_SQL.native);
s.] m?;PWMl-[ u8B0  DBMS_SQL.DEFINE_COLUMN(l_cursor, 1, l_value_list, 32767);
)hk;??1e3a1x;]0  ignore := DBMS_SQL.EXECUTE(l_cursor);ITPUB个人空间*Lz`%^"[/qI g
  --
e7O;eS b0  IF NOT UTL_FILE.IS_OPEN(cmn_file_handle) THENITPUB个人空间 K3n:n4F5h
        cmn_file_handle := UTL_FILE.FOPEN (p_output_folder, p_output_file, 'a',32767);
/w.ov1p[H bYf0  END IF;
jI,?o5_X6~0  ITPUB个人空间/y xL&`#hLG
  LOOP
`3c ZMw Y9@}#]'n r0    IF DBMS_SQL.FETCH_ROWS(l_cursor)>0 THENITPUB个人空间5si ~q7^R;X @]Du:p*@
      DBMS_SQL.COLUMN_VALUE(l_cursor, 1, l_value_list);
XV^X F$U L0      l_insertline1:='INSERT INTO '||p_table||' ('||l_column_list||')';ITPUB个人空间ywX.g*U*?'S{'o
      l_insertline2:=' VALUES ('||l_value_list||');';
ACB6yInDC'F0      UTL_FILE.put_line (cmn_file_handle, l_insertline1);ITPUB个人空间ZOe})u,|)j
      UTL_FILE.put_line (cmn_file_handle, l_insertline2);ITPUB个人空间%o C)Q,RY%w#S
    ELSE
5[nN8]*Eelzc'bm0      EXIT;
;V+c/d.^%TZ A.O5y0    END IF;ITPUB个人空间;@o0D\rA1r|
  END LOOP;ITPUB个人空间|2{.j5zX#Q-F*\ B
  IF NOT UTL_FILE.IS_OPEN(cmn_file_handle) THENITPUB个人空间gf i:I \ T
     UTL_FILE.FCLOSE (cmn_file_handle);ITPUB个人空间6z$t yK3C];b
  END IF;  
DK0v]y#kR*c0END;
;MA)F/S/o @,Z*~0/

TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-10-14  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 20466
  • 日志数: 291
  • 图片数: 2
  • 建立时间: 2007-12-11
  • 更新时间: 2008-10-04

RSS订阅

Open Toolbar