Несоответствие размера столбца вида и таблицы из-за UNION - PullRequest
0 голосов
/ 13 апреля 2020

Я создал представление с использованием объединенного CVAS:

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 и go с одним CVAS, то размеры станут равными в таблице и представлении. Это представление и таблицы являются частью больших скриптов, поэтому в скриптах отключено что-то, что вызывает такое поведение. Это странное поведение видно только с типами данных char и varchar2 . Я также проверил результат следующего запроса:

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

Пожалуйста, сообщите мне, что здесь может быть не так, что вызывает такое поведение.

Спасибо

1 Ответ

0 голосов
/ 13 апреля 2020

Какую версию вы тестируете? Вот что я получаю в своей БД (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) 
...