【发布时间】:2020-02-13 22:50:08
【问题描述】:
假设有一个函数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 表达式,调用该函数。
【问题讨论】:
标签: oracle plsql view type-conversion column-types