为什么视图列的类型与相应的函数结果类型不匹配?

问题描述 投票:1回答:1

假设具有函数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表达式,即可调用该函数。

oracle plsql view type-conversion column-types
1个回答
0
投票

因为创建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>

干杯!

© www.soinside.com 2019 - 2024. All rights reserved.