我有两个具有相同表的数据库,我的所有数据都分布在这些数据库之间,并且我有一个带有 union 子句的视图
CREATE OR REPLACE VIEW MY_UNION_VIEW AS
SELECT col1, col2 from tableX@db_link1
UNION
SELECT col1, col2 from tableX@db_link2
并且它运行良好,直到我们使用 rowid 进行选择
从 MY_UNION_VIEW 中选择 col1 - 确定
从 MY_UNION_VIEW 中选择 * - 确定
从 MY_UNION_VIEW 中选择 rowid、col1 - 错误(ORA-01446:无法使用 DISTINCT、GROUP BY 等从视图中选择 ROWID)
问题是 - 我无法更改 rowid select ,它是一个外部应用程序,我只能更改视图定义并可以在我的数据库中创建新对象
我有什么想法可以避免它吗?我知道 rowid 它是数据库中行的地址表示,并且“视图的 rowid”没有任何意义,但我必须通过使用 PK 选择它来从这些物理表(tableX@db_link1 或 tableX@db_link2)返回 rowid: select rowid哪里
我尝试添加 rowid 作为列并使用 UNION ALL 而不是 UNION:
CREATE OR REPLACE VIEW MY_UNION_VIEW AS
SELECT rowidtochar(rowid) AS "rowid", col1, col2 from tableX@db_link1
UNION ALL
SELECT rowidtochar(rowid) AS "rowid", col1, col2 from tableX@db_link2
我在这里使用 rowidtochar 转换,因为如果我尝试这样做:
CREATE OR REPLACE VIEW MY_UNION_VIEW AS
SELECT ROWID AS row_id, col1, col2 from tableX@db_link1
UNION ALL
SELECT ROWID AS row_id, col1, col2 from tableX@db_link2
我收到另一个错误 - ORA-01790:表达式必须与相应的表达式错误具有相同的数据类型
您使用的数据库版本是什么? 我无法在当前版本上重现
SQL> create or replace view vvvv as
2 select rowid r , empno from emp@pdb21a
3 union -- (same with union all )
4 select rowid r , deptno from dept@pdb21a;
View created.
SQL> select * from vvvv;
R EMPNO
------------------ ----------
AAAwjtAAMAAAAFuAAA 7369
AAAwjtAAMAAAAFuAAB 7499
AAAwjtAAMAAAAFuAAC 7521
AAAwjtAAMAAAAFuAAD 7566
AAAwjtAAMAAAAFuAAE 7654
AAAwjtAAMAAAAFuAAF 7698
AAAwjtAAMAAAAFuAAG 7782
AAAwjtAAMAAAAFuAAH 7788
AAAwjtAAMAAAAFuAAI 7839
AAAwjtAAMAAAAFuAAJ 7844
AAAwjtAAMAAAAFuAAK 7876
AAAwjtAAMAAAAFuAAL 7900
AAAwjtAAMAAAAFuAAM 7902
AAAwjtAAMAAAAFuAAN 7934
AAA0ASAAMAAAAF7AAA 12
AAA0ASAAMAAAAF7AAB 10
AAA0ASAAMAAAAF7AAC 11
AAA0ASAAMAAAAF7AAD 13
AAA0ASAAMAAAAF7AAE 21
AAA0ASAAMAAAAF7AAF 22
AAA0ASAAMAAAAF7AAG 42
21 rows selected.