oracle19c之導入、導出及腳本


  記錄一下oracle兩種常用的導入導出方式:exp、imp;spool、SQL*Loader及其腳本。

  一、exp與imp導入導出

  1、exp導出操作

exp c##sl/123456 buffer=64000 file=./full.sql full=y --導出整個數據庫
exp c##sl/123456 buffer=64000 file=./sl.sql owner=c##sl --導出用戶c##sl下的對象
exp c##sl/123456 buffer=64000 file=./book.sql tables=book --導出book表
exp c##sl/123456 buffer=64000 file=./book.sql tables=book,book2; --導出book、book2表

   2、imp導入操作

exp c##sl/123456 buffer=64000 file=./book.sql tables=book
drop table book;
imp c##sl/123456 buffer=64000 file=./book.sql tables=book --需要先刪除表,再導入,否則報錯
exp c##sl/123456 buffer=64000 file=./book.sql tables=book
imp c##sl/123456 buffer=64000 ignore=y file=./book.sql tables=book --只會導入主鍵不沖突的數據,沖突的忽略
exp c##sl/123456 buffer=64000 file=./sl.sql owner=c##sl
imp c##sl/123456 buffer=64000 ignore=y file=./sl.sql full=y --導入sl.sql中的全部文件
imp c##sl/123456 buffer=64000 ignore=y file=./sl.sql tables=book,book2 --導入sl.sql中的表book、與book2

  說明:tables指定導入或導出的表;full=y表示導入或導出全部;ignore=y表示跳過主鍵沖突執行

  、spool、SQL*Loader導入導出

  准備表與數據

CREATE TABLE book(
  id varchar2(10) NOT NULL,
  name varchar2(50) DEFAULT NULL,
  author varchar2(20) DEFAULT NULL,
  price decimal(10,0) DEFAULT NULL,
  update_time date DEFAULT NULL,
  create_time date DEFAULT NULL,
  is_deleted varchar2(1) DEFAULT NULL,
  PRIMARY KEY (id)
);

insert into book values ('1','c##','sl',23.4,to_date('2011-11-11 11:11:11','YYYY-MM-DD HH24:MI:SS'),
to_date('2011-11-11 11:11:14','YYYY-MM-DD HH24:MI:SS'),1);
insert into book values (
'2','c##','sl',23.4,to_date('2011-11-11 11:11:11','YYYY-MM-DD HH24:MI:SS'), to_date('2011-11-11 11:11:14','YYYY-MM-DD HH24:MI:SS'),1);
insert into book values (
'3','c##','sl',23.4,to_date('2011-11-11 11:11:11','YYYY-MM-DD HH24:MI:SS'), to_date('2011-11-11 11:11:14','YYYY-MM-DD HH24:MI:SS'),1);

  1、spool導出操作

  創建sql文件book_spoolout.sql

set echo off
set heading off
set feedback off
set pagesize 0 
set linesize 1000
spool book.dat
select id||','||name||','||author||','||price||','||to_char(update_time,'YYYY-MM-DD hh24:mi:ss')||','||
       to_char(create_time,'YYYY-MM-DD hh24:mi:ss')||','||is_deleted from book;
spool off

  登錄sqlplus,執行@導出文件

[root@localhost tmp]# sqlplus c##sl/123456
SQL> @book_spoolout.sql;

  導出數據文件book.dat如下:

1,c##,sl,23,2011-11-11 11:11:11,2011-11-11 11:11:14,1
2,c##,sl,23,2011-11-11 11:11:11,2011-11-11 11:11:14,1
3,c##,sl,23,2011-11-11 11:11:11,2011-11-11 11:11:14,1

  說明:

  a、這里導出字段以逗號分隔;

  b、這里登錄數據庫目錄與sql文件、導出文件目錄一致;

  c、如果導出目錄沒有寫權限,會報錯“無法創建 SPOOL 文件 "book.dat"當前未假脫機”,注意賦權;

  d、要把控制文件寫入文件中保存,如果直接復制到sqlplus中執行,導出的文件中首尾行含有其他命令或sql語句;

  2、SQL*Loader導入操作

  創建控制文件book.ctl

load data
infile book.dat
into table book
truncate
fields terminated by ","
(
    ID,
    NAME,
    AUTHOR,
    PRICE,
    UPDATE_TIME DATE "YYYY-MM-DD HH24:MI:SS",
    CREATE_TIME DATE "YYYY-MM-DD HH24:MI:SS",
    IS_DELETED
)

  執行導入命令,將上面的book.dat導入數據庫

sqlldr userid=c##sl/123456 control=book.ctl data=book.dat

  注意:

  a、這里的控制文件與數據文件在同一目錄下

  b、truncate是刪除原表數據,還有insert、append、replace等

  c、fields terminated by是字段分隔符

  三、腳本

  可以看到spool、sql loader的導入導出還是挺復雜的,下面整理出通用性更強的腳本

  1、導出

  准備表與數據

CREATE TABLE music(
  id varchar2(10) NOT NULL,
  name varchar2(50) DEFAULT NULL,
  author varchar2(20) DEFAULT NULL,
  price decimal(10,2) DEFAULT NULL,
  update_time varchar2(19) DEFAULT NULL,
  create_time varchar2(19) DEFAULT NULL,
  is_deleted varchar2(1) DEFAULT NULL,
  PRIMARY KEY (id)
);

insert into music values ('1','你好你好','sl',23.4,'2011-11-11 11:11:11','2011-11-11 11:11:14','1');
insert into music values ('2','你好你好','sl',23.4,'2011-11-11 11:11:11','2011-11-11 11:11:14','1');
insert into music values ('3','你好你好','sl',23.4,'2011-11-11 11:11:11','2011-11-11 11:11:14','1');

  創建腳本oracleout省略。。。

  執行示例,導出music表的數據到music.dat文件,以|!?|分隔字段,以@#$結束一行

./oracleout music /usr/local/myroom/temp/music.dat c##sl/123456  -f'|!?|' -r'@#$'

  2、導入

  創建腳本oraclein省略。。。

  執行腳本,導入數據

./oraclein music /usr/local/myroom/temp/music.dat c##sl/123456  -f'|!?|' -r'@#$'

  說明:對導入腳本中dbms_output.put_line('infile ${DATANAME} '|| '"str ''${ROW}\n''" ');的解析

  load data的str屬性表示數據的換行符,比如

  load data infile music.dat "str '!!\n'" into table ... ... 表示數據文件中以!!換行,如下:

3^^你好你好^^sl^^23.4^^2011-11-11 11:11:11^^2011-11-11 11:11:14^^1!!
2^^你好你好^^sl^^23.4^^2011-11-11 11:11:11^^2011-11-11 11:11:14^^1!!
1^^你好你好^^sl^^23.4^^2011-11-11 11:11:11^^2011-11-11 11:11:14^^1!!

  a、"\n"是自帶的換行符,因為數據手動換行了,所以str后面除了指定的換行符"!!"還有"\n"

  b、有些文件中手動的換行符不是"\n"而是"\r\n",這時對應語句改為......"str '!!\r\n'"......

  c、str后面還可以跟X+轉成raw類型的字符,下面的語句執行效果相同。

dbms_output.put_line('infile book.dat '|| '"str ''@#$\n''" ');
dbms_output.put_line('infile book.dat '|| '"str X''4023240A''" ');

  select utl_raw.cast_to_raw('@#$') from dual查詢結果是402324,0A代表換行。(查詢結果也可能原樣輸出,跟數據庫字符集有關)

    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM