在平常的工作中,會遇到這樣的需求:我新建一個數(shù)據(jù)庫環(huán)境,里面的數(shù)據(jù)比較少,我想從其他地方導入數(shù)據(jù)進來。這包括很多方法,比如使用imp/exp工具,又或者使用sqlloader,還可以直接使用pl/sql工具直接copy數(shù)據(jù)到表中,再或者直接引用其它用戶的表數(shù)據(jù),還有通過創(chuàng)建databaselink鏈接到遠程數(shù)據(jù)庫來取數(shù)據(jù),等等??傊椒ê芏?,只要你喜歡,就可以任你挑。
下面我就來詳細講述一下各種方法的具體實現(xiàn)步驟(限于帖子篇幅大小只有15K,所以不能弄些圖片上來,只好以文字說明,不夠詳細的地方,請大家見諒
1:使用imp/exp工具
這個比較簡單,借助pl/sql developer工具,菜鳥也可以輕松的掌握數(shù)據(jù)導入和數(shù)據(jù)導出的方法。這個就不多說了,動手試一下,就會了的。
2:使用sql loader
使用這個命令工具,需要2個基本文件。
1——原始數(shù)據(jù)文件,2——控制文件
舉個例子如下:
原始數(shù)據(jù)文件
3|551|1|5513180000|10328|2002.12.21|2008.04.11|1|
53|551|1|5512875744|18700|2002.12.25|2007.03.01|3|
279|558|10|5583380564|-1867|2003.01.02|2007.07.28|2|
280|558|10|5583389887|-4031|2003.01.02|2007.06.28|2|
287|558|10|5583281357|201|2003.01.02|2007.11.18|1|
294|558|10|5583380246|567|2003.01.02|2009.06.03|1|
297|558|10|5583381199|7541|2003.01.02|2008.06.22|1|
298|558|10|5583386077|-1789|2003.01.02|2007.08.08|2|
301|558|10|5583281041|-3553|2003.01.02|2007.01.13|3|
307|558|10|5583381002|-73|2003.01.02|2007.09.13|2|
控制文件zte_userbasnews.ctl
load data
infile userbasnews.data
truncate into table zte_userbasnews
fields terminated by ‘|‘
(
user_unique_id ,
latn_id ,
service_area_id ,
phs_number ,
balance ,
created_date Date ‘YYYY.MM.DD‘,
eff_day Date ‘YYYY.MM.DD‘,
state
)
以上文件要注意存放路徑,當他們保存在同一目錄下時,執(zhí)行如下命令即可。
sqlldr ODSB/ODSB@AH_OCS control=zte_userbasnews.ctl direct=true
那么,原始數(shù)據(jù)文件的每一行,會被以 ‘|‘ 分割,而逐個字段的導入相應表中。
3:直接使用pl/sql工具直接copy數(shù)據(jù)到表中
如果你使用過pl/sql工具,應該熟悉.csv文件和.tsv文件,這是PL/SQL DEVELOPER 導出數(shù)據(jù)時候可以選擇的一種文件存儲格式。
當你執(zhí)行了如下的命令: ‘select * from test for update;‘ 的時候,你可以把你的.tsv和.csv文件直接copy到pl/sql developer的表中去。然后,提交,成功。
本來想截圖演示的,可惜圖片太大,所以抱歉拉!
其實pl/sql developer的這種數(shù)據(jù)導入格式也支持excel文檔。
4:引用其它用戶的表
比如在同一個數(shù)據(jù)庫db1中有兩個用戶uesr1和user2。如何在登陸user1的時候也能操作user2的表呢?
很簡單,在user2的表名稱前面加上用戶前綴user2.
例如登陸為user1的用戶想訪問user2的某張表test_table.
執(zhí)行如下命令即可:
select * from user2.test_table;
這樣就跟訪問自己的表是一樣的。千萬要注意:默認情況下,這種訪問方式的權(quán)限是很大的,select,insert,update,delete,以上權(quán)限都支持,要注意數(shù)據(jù)的安全性。
5:通過創(chuàng)建database link鏈接到遠程數(shù)據(jù)庫來取數(shù)據(jù)
關于database link的概念,請去下面這個網(wǎng)址上查看詳細介紹。
http://www.haidao8.net/read.php?tid=1309
怎么創(chuàng)建database link?
-- Create database link
--在知道tns名稱的情況下,創(chuàng)建DATABASE LINK?
create [public] database link test_dblink (連接名稱)
connect to user (login 帳戶) identified by password
using ‘TNS_NAME‘ (login SID對應的TNS NAME);
--在不知道tns名稱的情況下,如何創(chuàng)建DATABASE LINK?
create database link test_dblink
connect to user identified by password
using
‘(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = testdb)
)
)‘;
創(chuàng)建了database link之后,那么如何訪問遠程數(shù)據(jù)呢?
以上面的database link為例,我們來訪問
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = testdb)
)
)
上的某個表 liwp_test .
執(zhí)行如下命令:select * from liwp_test@test_dblink;
很簡單,只需要在表的后面加上 @test_dblink 就可以了。
這樣就跟訪問自己的表是一樣的。千萬要注意:默認情況下,這種訪問方式的權(quán)限是很大的,select,insert,update,delete,以上權(quán)限都支持,要注意數(shù)據(jù)的安全性。
接下來,講述一下在創(chuàng)建database link后常見的錯誤,及解決方法。
這后面的內(nèi)容就是轉(zhuǎn)貼自高手們的實際經(jīng)驗了,與大家共同分享。
---------------------------文章1----------------------------
ORA-02085錯誤解決過程!
今天看EYGLE的文章:http://www.eygle.com/archives/2005/06/oraclessoeaeaeo.html(Oracle高級復制的創(chuàng)建配置步驟-Step by Step),里面講到了:本例的先決條件:你需要設置好相應的參數(shù),job_queue_processes需要大于0,global_name=true,并且建立相應的db link.
于是我這個菜鳥便檢查主數(shù)據(jù)庫job_queue_processes和global_names參數(shù),并通過alter system set global_names=true;修改global_names參數(shù),沒有任何問題!
然后在主數(shù)據(jù)庫創(chuàng)建dblink:
create database link test_link
connect to myuser identified by pass
using ‘mydb2‘;
創(chuàng)建過程也沒有問題!但是使用dblink進行查詢就出錯了:
SQL> select count(*) from town@test_link;
select count(*) from town@test_link
ORA-02085: database link TEST_LINK connects to STIOMDB
SQL>
經(jīng)過在網(wǎng)上搜看別人的帖子并測試發(fā)現(xiàn):
當global_name參數(shù)設置為true,則dblink必須命名為和在目標數(shù)據(jù)庫如下查詢出的結(jié)果一致:
select * from global_name,例如:
在目標數(shù)據(jù)庫執(zhí)行查詢:
SQL> select * from global_name;
GLOBAL_NAME
--------------------------------------------------------------------------------
mydb
SQL>
則修改dblink:
create database link mydb connect to myuser identified by pass using ‘mydb2‘;
然后執(zhí)行查詢:
SQL> select count(*) from town@mydb;
COUNT(*)
----------
13507
SQL>
-------------------------------文章2----------------------------------
Q:建dblink成功,查詢時報ORA-02085,尋求高手建議!
我在自己的機子上裝了個8.1.6服務器,機子的操作系統(tǒng)是2000?,F(xiàn)在要在自己的服務器上建個dblink,指向遠端服務器 為此,我用dba帳戶建立鏈接
create database link ora817
connect to lssw
identified by lssw
using ‘lsjf‘;
成功建立,但執(zhí)行如下查詢:
select * from hdsc04@ora817;
ORA-02085: 數(shù)據(jù)庫鏈接ora817與LSJF相連結(jié)
補充:我用sqlplus 能用上述帳戶及連接串聯(lián)到遠端服務器,
ora817和遠端的sid名一樣。
查service@ora817也一樣報錯
select * from service@ora817
*
ERROR 位于第 1 行:
ORA-02085: 數(shù)據(jù)庫鏈接ORA817與LSJF相連結(jié)
使用數(shù)據(jù)連接可以很方便的引用其它數(shù)據(jù)庫的數(shù)據(jù),但是設置不當可能遇到ORA-02085錯誤。如果被連接對方的GLOBAL_NAMES參數(shù)設置成了TRUE,那么要求數(shù)據(jù)庫連接與對方實例名有相同的名稱。這樣就可以通過下面3中的任意一種方法來解決:
1.修改對方的GLOBAL_NAMES參數(shù)為FALSE
alter system set global_names = false;
2.將對方的GLOBAL_NAME設置成與數(shù)據(jù)庫連接相同的名稱
alter database rename global_name to new_name;
3.將數(shù)據(jù)庫連接刪掉重新創(chuàng)建成與對方實例名相同的數(shù)據(jù)庫連接
PS:看了網(wǎng)上的一些技術(shù)帖子,我對oracle也更感興趣了,也更加欽佩這些高手們了。
其實工作中,很多時候,公司需要的并不是僅能發(fā)現(xiàn)問題的人,而是能解決問題的人!
——與大家共勉