我有一个像这样的查询
INSERT INTO sid_rem@dev_db
(sid)
select sid from v$session
现在,当我执行这个查询时,我得到
ORA-02070: database does not support in this context
仅当我将 v$session 中的数据插入某个远程数据库时,才会发生此错误。它适用于任何其他表。
任何人都知道为什么会出现这个问题以及任何解决方法吗?
使用gv$session
而不是v$session
:
INSERT INTO sid_rem@dev_db(sid)
select sid from gv$session;
gv$ 视图是全局视图,也就是说,它们不限于一个节点(实例),而是可以看到整个数据库(RAC)。v$ 视图是 gv$ 的子视图。
在互联网上搜索我发现这与分布式事务有关。
迟到的答案,但可能仍然有用。我发现当尝试从系统视图中包含 LONG 类型列的数据库链接中选择系统视图时会发生此错误。如果可以改写查询以避免 LONG 列,则这些连接将正常工作。
例子:
SELECT dc_prod.*
FROM dba_constraints@prod_link dc_prod
INNER JOIN dba_constraints dc_dev
ON (dc_dev.CONSTRAINT_NAME = dc_prod.CONSTRAINT_NAME)
由于访问 LONG 列,将失败并返回 ORA-02070 SEARCH_CONDITION
,但是
SELECT dc_prod.*
FROM (SELECT OWNER,
CONSTRAINT_NAME,
CONSTRAINT_TYPE,
TABLE_NAME,
-- SEARCH_CONDITION,
R_OWNER,
R_CONSTRAINT_NAME,
DELETE_RULE,
STATUS,
DEFERRABLE,
DEFERRED,
VALIDATED,
GENERATED,
BAD,
RELY,
LAST_CHANGE,
INDEX_OWNER,
INDEX_NAME,
INVALID,
VIEW_RELATED
FROM dba_constraints@prod_link) dc_prod
INNER JOIN (SELECT OWNER,
CONSTRAINT_NAME,
CONSTRAINT_TYPE,
TABLE_NAME,
-- SEARCH_CONDITION,
R_OWNER,
R_CONSTRAINT_NAME,
DELETE_RULE,
STATUS,
DEFERRABLE,
DEFERRED,
VALIDATED,
GENERATED,
BAD,
RELY,
LAST_CHANGE,
INDEX_OWNER,
INDEX_NAME,
INVALID,
VIEW_RELATED
FROM dba_constraints) dc_dev
ON (dc_dev.CONSTRAINT_NAME = dc_prod.CONSTRAINT_NAME)
SEARCH_CONDITION
工作正常,因为未访问 DBA_CONSTRAINTS 中的 LONG 列。
分享和享受。
我不知道为什么会这样,它可能在某个地方的文档中,但我的 Oracle-Docs-Fu 今天似乎已经抛弃了我。
一种可能的解决方法是使用全局临时表
SQL> create table tmp_ben ( sid number );
Table created.
SQL> connect schema/pw@db2
Connected.
SQL> create table tmp_ben ( sid number );
Table created.
SQL> insert into tmp_ben@db1 select sid from v$session;
insert into tmp_ben@db1 select sid from v$session
*
ERROR at line 1:
ORA-02070: database does not support in this context
SQL> create global temporary table tmp_ben_test ( sid number );
Table created.
SQL> insert into tmp_ben_test select sid from v$session;
73 rows created.
SQL> insert into tmp_ben@db1 select * from tmp_ben_test;
73 rows created.