国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

同時使用數據庫鏈和序列時的注意事項

2024-07-21 02:41:53
字體:
來源:轉載
供稿:網友

正常情況下,在一條語句中如果同時包括數據庫鏈和序列,就會出現潛在的問題,而Oracle的官方文檔在這里描述的并不是十分清楚。

以下通過一個例子對同時包括數據庫鏈和序列的幾種情況分別進行說明。

首先,大家需要構造一個測試的環境(注:兩個數據庫的GLOBAL_NAMES均為TRUE):


SQL> conn scott/tiger@yangtk
已連接。
SQL> create table test_on_yangtk (id number);
表已創建。
SQL> insert into test_on_yangtk values (1);
已創建 1 行。
SQL> commit;
提交完成。
SQL> create sequence seq_on_yangtk;
序列已創建。
SQL> conn yangtk/yangtk@test4
已連接。
SQL> create table test_on_test4 (id number);
表已創建。
SQL> insert into test_on_test4 values (1);
已創建 1 行。
SQL> commit;
提交完成。
SQL> create sequence seq_on_test4;
序列已創建。
SQL> create database link yangtk connect to scott identified by tiger using 'yangtk';
數據庫鏈接已創建。

對于簡單的查詢語句,可以分為以下四種情況。

1.從本地表中讀取數據,并引用本地序列。


SQL> select seq_on_test4.nextval from test_on_test4;


NEXTVAL
----------
1

2.從本地表中讀取數據,但訪問遠端序列,這時,需要在序列后面加上數據庫鏈名稱。


SQL> select seq_on_yangtk.nextval@yangtk from test_on_test4;
NEXTVAL
----------
1

3.讀取遠端數據表中數據,同時訪問遠端序列。


SQL> select seq_on_yangtk.nextval@yangtk from test_on_yangtk@yangtk;
NEXTVAL
----------
2

4.讀取遠端數據表中數據,但是訪問本地序列。


SQL> select seq_on_test4.nextval from test_on_yangtk@yangtk;
NEXTVAL
----------
2

經過測試,此四種情況工作都很正常。

下面,我們來考慮分布式事務——以INSERT INTO SELECT為例。

由于INSERT的表可以是本地表,也可以是遠端表,對于每種情況,對應的子查詢語句都可能包含上面四種情況,下面我們來分別進行具體的分析。

 

一、插入本地表

 

1.從本地表中讀取數據,并引用本地序列


SQL> insert into test_on_test4 select seq_on_test4.nextval from test_on_test4;
已創建 1 行。
SQL> rollback;
回退已完成。

2.從本地表中讀取數據,但訪問遠端序列


SQL> insert into test_on_test4 select
seq_on_yangtk.nextval@yangtk from test_on_test4;


已創建 1 行。


SQL> rollback;


回退已完成。

3.讀取遠端數據表中數據,同時訪問遠端序列。


SQL> insert into test_on_test4 select seq_on_yangtk.nextval@yangtk from test_on_yangtk@yangtk;


已創建 1 行。


SQL> rollback;


回退已完成。


4.讀取遠端數據表中數據,但是訪問本地序列。


SQL> insert into test_on_test4 select
seq_on_test4.nextval from test_on_yangtk@yangtk;
已創建 1 行。
SQL> rollback;
回退已完成。
經測試,插入本地表的四種情況,沒有出錯。


二、插入遠端表

 

1.從本地表中讀取數據,并引用本地序列


SQL> insert into test_on_yangtk@yangtk select
seq_on_test4.nextval from test_on_test4;
insert into test_on_yangtk@yangtk select
seq_on_test4.nextval from test_on_test4
*
ERROR 位于第 1 行:
ORA-02289: 序列(號)不存在
ORA-02063: 緊接著line(源于TEST4)
ORA-02063: 緊接著2 lines(源于YANGTK)

2.從本地表中讀取數據,但訪問遠端序列


SQL> insert into test_on_yangtk@yangtk
select seq_on_yangtk.nextval@yangtk from test_on_test4;


已創建 1 行。


SQL> rollback;


回退已完成。

3.讀取遠端數據表中數據,同時訪問遠端序列。


SQL> insert into test_on_yangtk@yangtk
select seq_on_yangtk.nextval@yangtk from test_on_yangtk@yangtk;


已創建 1 行。


SQL> rollback;


回退已完成。


4.讀取遠端數據表中數據,但是訪問本地序列。

 

SQL> insert into test_on_yangtk@yangtk select seq_on_test4.nextval from test_on_yangtk@yangtk;
insert into test_on_yangtk@yangtk select seq_on_test4.nextval from test_on_yangtk@yangtk
*
ERROR 位于第 1 行:
ORA-02289: 序列(號)不存在
ORA-02063: 緊接著line(源于TEST4)
ORA-02063: 緊接著2 lines(源于YANGTK)

根據測試,第一種情況和第四種情況出現了相同的錯誤。

在和其他所有沒有報錯的情況比較后,可以得到這樣的結論:當插入遠端數據表,并使用本地序列時會出現錯誤。

 

Oracle的error文檔上這樣描述2289錯誤的:


ORA-02289 sequence does not exist
Cause: The specified sequence does not exist,
or the user does not have the required
PRivilege to perform this Operation.
Action: Make sure the sequence name is correct,
and that you have the right to perform
the desired operation on this sequence.

根據目前的錯誤以及Oracle給出的錯誤原因,初步懷疑對于這種插入遠端數據表的分布式事務,實際上是在遠端上執行的。因此YANGTK上的scott用戶找不到SEQ_ON_TEST4這個序列。

給YANGTK上的scott用戶增加一個指向TEST4上yangtk用戶的數據庫鏈。


SQL> conn scott/tiger@yangtk
已連接。
SQL> create database link test4 connect to
yangtk identified by yangtk using 'test4';


數據庫鏈接已創建。


SQL> conn yangtk/yangtk@test4
已連接。
SQL> insert into test_on_yangtk@yangtk select
seq_on_test4.nextval from test_on_test4;


已創建 1 行。


SQL> rollback;


回退已完成。


SQL> insert into test_on_yangtk@yangtk select
seq_on_test4.nextval from test_on_yangtk@yangtk;


已創建 1 行。


SQL> rollback;


回退已完成。

在建立數據庫鏈之后,重新執行錯誤的語句,這次執行沒有出現錯誤。

總結:

假如在一條語句中同時使用數據庫鏈和序列,大家需要注意的是:目前可能不僅需要一條到遠端的數據庫鏈,還可能同時需要一個從遠端到本地的數據庫鏈。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 长海县| 满城县| 南岸区| 广汉市| 攀枝花市| 乌苏市| 建水县| 盐亭县| 伊通| 正阳县| 建水县| 滨海县| 嘉兴市| 瓦房店市| 博罗县| 翼城县| 崇礼县| 阿鲁科尔沁旗| 石台县| 张家口市| 林口县| 定边县| 游戏| 东兰县| 柘荣县| 大洼县| 廊坊市| 黎城县| 镇原县| 沙坪坝区| 聂荣县| 当涂县| 平和县| 外汇| 通榆县| 汤原县| 鄂伦春自治旗| 团风县| 鄯善县| 岳池县| 江北区|