假设具有函数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
我想清楚地获得列类型和函数结果类型的匹配。
[众所周知,像CAST(val AS CHAR(5))
这样的强制转换可以暂时解决问题,但是有一种更优雅的方法,它也可以处理更改函数返回类型的情况,而无需在列中的任何地方更改CAST
表达式,即可调用该函数。
因为创建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>
干杯!