避免更改引起的大量改動

2021-08-21 22:54:22 字數 3202 閱讀 8353

因為所有的操作最終都作用在基表上,因此基表名和列名的變化會對這些語句產生影響,此時必須修改所有的語句,這樣不但麻煩,有時甚至會發生錯誤。另外,有的甚至表名和列名複雜而晦澀,用起來極不方便。怎樣才能解決這個問題呢?避免直接依賴於基表的問題,方法有:

●使用檢視為表名和列名起別名,在應用過程中可以借助檢視中的名字來代替基表名和列名,當表名和列名改變時,只需改變相應檢視的定義即可。

●類似於檢視定義,只不過提供了一種更直接更廣泛的方法來為各種物件定義別名,其中也包括檢視物件。

●在程式中用定義游標的方法防止直接依賴於表。當表名改變時,只需改變游標定義即可。

一、使用檢視(略)

二、使用同義名

1、簡介

和使用檢視來實現操作不直接依賴於基表一樣,同義名也能實現這一目的。與檢視不同的是同義名不但可以應用在表的命名中,同樣也可以應用在檢視、序列、儲存過程和函式以及包中,因此它的應用範圍更廣泛。用同義名的不便之處是它不能對列起別名,這一點不如檢視。

建立同義名的語法如下所示:

create [public]synonym 同義名 for 物件;

其中:●public:公共同義名,所有使用者都可以引用,若省略此關鍵字不寫,則預設是private同義名,即私有同義名,它只能為某一使用者使用。

●同義名:為物件起的別名,在以後使用物件時可以用此名來代替原物件名。

●物件:某一特定物件名,它可以是基表、檢視、序列、過程、儲存函式、儲存包和其它同義名,指定物件時可以指定所屬使用者,中間用「.」分開。

2、具體操作

●建立私有同義名

【例】為persons表起同義名為person。

sql>create synonym person for persons;

此外用的是預設private同義名,只能為當前使用者使用。若要指定其為另一使用者使用,比如使用者jxl,則可用以下語句建立。

sql>create synonym person fro jxl.persons;

●建立公共同義名

也可以建立公共同義名給所有使用者使用

【例】sql>create public synonym person fro persons;

●使用同義名

建立了同義名之後,就可以在其他地方引用它,以此來代替基表的引用。如下所示:

sql>insert into person values(98036,'skert','w',to_date('25-oct-71'));

在以後使用過程中,若基表的名字變了,只需修改同義名的定義即可。但同義名建立不支援replace命令,因此必須將其刪除再重新建立。刪除命令如下:

sql>drop synonym person;

若persons表更名為persons_information,則重新定義同義名如下:

sql>create synonym person for persons_information;

這樣和使用檢視一樣,所有引用同義名的地方不必做任何改動。

●刪除同義名

若乙個物件(如表)被刪除了,則同時也要將相應的同義名刪除,因為此時再引用同義名將產生錯誤,另外也為了清理資料字典。刪除同義名語法如下:

drop [public] synonym;

其中的public在刪除公共同義名的情況下使用,若刪除某乙個使用者的同義名,則必須加上使用者名稱。前面定義的3種同義名分別刪除如下:

sql>drop synonym person;

sql>drop synonym jxl.person;

sql>drop public synonym person;

在分布式資料庫系統中,同義名意義更大。因為在分布式環境中,既可以使用本地的資料庫物件,也可以引用其它地方的資料庫物件,而且不同地方的物件可能同名。這樣在引用物件時,必須指明所在的位置。但若引用了同義名,則可以將位置隱藏起來,使所有物件透明使用,這樣便可以適應各種變化而簡化應用。

三、使用游標

1、簡介

在儲存過程和函式中可以使用顯式游標,游標相當於定義了乙個查詢,在以後應用中可能用這個游標的查詢結果。

當表名改變時,在儲存過程和函式中只需改變定義在這個表上的游標即可,後面對游標的引用不用變,從而避免了直接依賴於表的操作。

2、具體操作

●在程式中使用游標

【例】declare

person_no number(5);

person_name char(10);

person_*** char(1);

cursor person is select no,name,*** from persons where no<98050;

begin

open person;

fetch person into person_no,person_name,person_***;

loop

exit when person%notfound;

if person_***='m' then

insert into man values(person_no,person_name);

else

insert into woman values(person_no,person_name);

end if;

fetch person into person_no,person_name,person_***;

end loop;

close person;

end;

這段pl/sql程式實現將男女員工分別登記在man、woman表中的功能,它用到了乙個游標person。可以看到,在程式體中,雖然引用了表persons的內容,但卻沒有引用persons表名,而只是在游標定義時引用了一次。

●修改游標定義以適應變化

當將persons表名改為persons_information時,只需將游標定義處的表名修改一下即可,而程式將完成相同的功能。

【例】游標定義如下所示:

cursor person is

select no,name,***

from persons_information

where no<98050;

這個程式比較短,即使不用游標也沒多大關係。當應用程式很大時,就有必要考慮游標的使用,並且最好將所有儲存過程和函式放到乙個包中。這樣,只需對游標定義一次,便可以在所有過程和函式中使用。

當然,使用游標也有自己的缺點,它並不能直觀地解決直接信賴於表的問題,游標在網路資料庫中對減少網路傳輸量的用途更大一些。

(摘自oracle 9i簡明教程 清華大學出版社)

configure 更改prefix引起的問題

編譯了乙個庫,後來打算更改一下安裝路徑作為系統庫 configure prefix usr lib 因為庫比較大,又想只是改動了prefix對 不會又影響,就沒有make clean,直接make install了,庫安裝到了 usr lib,但是在編譯其他使用該庫的程式時發現仍然去舊的安裝位置尋找...

如何避免HBase寫入過快引起的各種問題

整個寫入流程從客戶端呼叫api開始,資料會通過protobuf編碼成乙個請求,通過scoket實現的ipc模組被送達server的rpc佇列中。最後由負責處理rpc的handler取出請求完成寫入操作。寫入會先寫wal檔案,然後再寫乙份到記憶體中,也就是memstore模組,當滿足條件時,memst...

避免Qt庫引起「過期」lib或obj的問題

前兩天辛辛苦苦用vc express 2005 sp1編譯了三個小時的qt opensource 4.5.1 版本,給同事的vc pro 2005 sp1使用時,他居然遇到嚴重錯誤 編譯生成release配置的時候 fatal error c1047 the object or library fi...