由于UNION,视图和表的列大小不匹配

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

我已经使用联合的CVAS创建了View:

CREATE
OR REPLACE VIEW SAMPLEVIEW AS
SELECT
  PT.CREDITPARTYACCOUNT AS PT_CREDITPARTYACCOUNT,
  PT.DEBITPARTYACCOUNT AS PT_DEBITPARTYACCOUNT,
...
...
FROM
  accountingevent AE
  LEFT OUTER JOIN paymenttransaction PT ON (
    AE.PAYMENTTRANSACTIONKEY = PT.PAYMENTTRANSACTIONKEY
  )
  OR (
    AE.PAYMENTINSTRUCTIONKEY = PT.INCOMINGINSTRUCTIONKEY
  )
WHERE
  ...
UNION ALL
SELECT
  PT.CREDITPARTYACCOUNT AS PT_CREDITPARTYACCOUNT,
  PT.DEBITPARTYACCOUNT AS PT_DEBITPARTYACCOUNT,
...
...
FROM
  accountingevent AE
  LEFT OUTER JOIN paymenttransaction PT ON (
    AE.PAYMENTTRANSACTIONKEY = PT.PAYMENTTRANSACTIONKEY
  )
WHERE
    ...
ORDER BY 1;

结果

DESC SAMPLEVIEW;
PT_CREDITPARTYACCOUNT   VARCHAR2(1024 CHAR)
PT_DEBITPARTYACCOUNT    VARCHAR2(1024 CHAR)
...
...

AND

DESC PAYMENTTRANSACTION;
CREDITPARTYACCOUNT  VARCHAR2(256 CHAR)
DEBITPARTYACCOUNT   VARCHAR2(256 CHAR)
...

我得到的数据大小是4倍表列大小的大小。如果我们删除UNION ALL并使用单个CVAS,则表和视图中的大小将相等。该视图和表是大型脚本的一部分,因此脚本中的某些内容已关闭,导致此行为。此奇怪的行为仅在charvarchar2数据类型中可见。我还检查了以下查询的结果:

select * from NLS_DATABASE_PARAMETERS where parameter='NLS_CHARACTERSET';
NLS_CHARACTERSET    AL32UTF8

请指导我有关可能导致此问题的错误之处。

谢谢

oracle view char union-all varchar2
1个回答
0
投票
您正在测试哪个版本?这是我在数据库(20.2)上获得的信息:

SQL> desc tukc Name Null? Type ----------- ----- ------------------ OBJECT_NAME VARCHAR2(128 CHAR) OBJECT_ID NUMBER SQL> SQL> create or replace view tv as 2 select t.object_name 3 from tukc t join all_objects o on (t.object_id=o.object_id) 4 union all 5 select t.object_name 6 from tukc t join all_objects o on (t.object_id=o.object_id) 7 ; View TV created. SQL> desc tv Name Null? Type ----------- ----- ------------------ OBJECT_NAME VARCHAR2(128 CHAR)

© www.soinside.com 2019 - 2024. All rights reserved.