Почему тип столбца представления не соответствует типу результата соответствующей функции? - PullRequest
3 голосов
/ 17 октября 2019

Предположим, есть функция my_pkg.get_prop_of, которая возвращает значение типа CHAR(5). Также давайте объявим представление my_view с одним столбцом prop, получающее его значение из этого вызова функции.

create or replace package my_pkg AS

  subtype short_string is CHAR(5);

  function get_prop_of(pi_name char)
    return short_string;    
end;    

create or replace package body my_pkg AS

  function get_prop_of(pi_name char)
    return short_string is
  begin
    return substr(pi_name || 'abcde', 1, 5);
  end;    
end;
---

create or replace view my_view as
select 
       my_pkg.get_prop_of('x') as prop
  from dual;

Не могли бы вы объяснить, почему в словаре данных этот тип столбца отображается как VARCHAR2(4000), то естьцель такого поведения?

select table_name, data_Type, data_length
  from all_tab_cols
 where table_name = 'MY_VIEW';

----------------------------------------------------
 TABLE_NAME | COLUMN_NAME | DATA_TYPE | DATA_LENGTH
----------------------------------------------------
   MY_VIEW  |  PROP       |  VARCHAR2 |    4000

Похоже, словарь данных содержит необходимые данные, чтобы позволить компилятору применять их во время компиляции представления. Но почему-то это не так.

select object_name, package_name, data_type, data_length, in_out
  from all_arguments
 where object_name = 'GET_PROP_OF';

-----------------------------------------------------------------
  OBJECT_NAME  | PACKAGE_NAME | DATA_TYPE | DATA_LENGTH | IN_OUT
-----------------------------------------------------------------
  GET_PROP_OF  |    MY_PKG    |   CHAR    |      5      |  OUT     <- return type
  GET_PROP_OF  |    MY_PKG    |   CHAR    |             |  IN

Я хотел бы получить четкое представление о соответствии типа столбца и типа результата функции.

Известно, что жесткое приведение типаCAST(val AS CHAR(5)) может временно решить проблему, но есть более элегантный способ, который также обрабатывает случай изменения типа возвращаемого значения функции без необходимости изменять выражение CAST везде в столбцах, вызывая эту функцию.

Ответы [ 2 ]

0 голосов
/ 17 октября 2019

Поскольку вы создаете представление с помощью своей функции

Функция, определяющая тип данных представлений как VARCHAR2 (4000), влияющий на производительность?

create or replace view my_view as
select 
       substr(my_pkg.get_prop_of('x'),0,5) q
  from dual;

  select table_name, data_Type, data_length
  from dba_tab_cols
 where table_name = 'MY_VIEW';



MY_VIEW VARCHAR2    5
0 голосов
/ 17 октября 2019

Поскольку при создании VIEW Oracle не знает максимального значения результата function, возвращаемого из function, но знает тип данных.

Кроме того, факт -> любое возвращаемое значение из function не может содержать data precision.

Вы все еще можете достичь того, что хотите, контролируя тип данных и точность вVIEW запрос с использованием CAST следующим образом:

SQL>
SQL> CREATE OR REPLACE VIEW MY_VIEW AS
  2      SELECT
  3          CAST(MY_PKG.GET_PROP_OF('x') AS VARCHAR2(5)) AS PROP
  4      FROM
  5          DUAL;

View created.

SQL> DESC MY_VIEW;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 PROP                                               VARCHAR2(5)

SQL>

Cheers !!

...