ORA-01446 尝试使用 union 子句从视图中选择 rowid

问题描述 投票:0回答:1

我有两个具有相同表的数据库,我的所有数据都分布在这些数据库之间,并且我有一个带有 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 database oracle plsql oracle19c
1个回答
0
投票

您使用的数据库版本是什么? 我无法在当前版本上重现

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.
© www.soinside.com 2019 - 2024. All rights reserved.