Предположим, есть функция 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
везде в столбцах, вызывая эту функцию.