从视图中选择列,获取错误属性或元素值大于oracle中类型中指定的值

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

我正在使用 Oracle 19c,当尝试从名为

AAA_BBB_CCCCC_DDDD_U_1A_1A_U_1A_1A_1A
的视图中选择所有列时,我遇到了错误

ORA-22814: 属性或元素值大于指定值 类型。

我使用的SQL是:

select * from AAA_BBB_CCCCC_DDDD_U_1A_1A_U_1A_1A_1A;

但是,当我使用相同的方法从另一个视图中选择时,它成功了:

select * from AAA_BBB_CCCCC_DDDD_U0_U_1A;

请问Oracle中视图名称是否有长度限制,或者是否有其他原因导致此错误。此外,这两个视图具有相似的结构,并且都是空的。我想知道为什么一个视图会发生错误,而另一个视图不会发生错误。任何解决此问题的见解或建议将不胜感激。

sql oracle select view oracle19c
1个回答
0
投票

问题与标识符的长度无关,而与您在表中使用的数据类型的大小以及您的视图使用的任何类型有关。


让我们假设您有集合类型:

CREATE TYPE varchar2_table AS TABLE OF VARCHAR2(3);

还有桌子:

CREATE TABLE table_name (data VARCHAR2(4));

INSERT INTO table_name (data)
SELECT RPAD('X', LEVEL, 'X') FROM DUAL CONNECT BY LEVEL <= 4;

然后,如果您尝试

COLLECT
表中的值,然后
CAST
将它们放入集合中:

SELECT COLUMN_VALUE
FROM   TABLE(
         (SELECT CAST(
                   COLLECT(
                     data
                     ORDER BY data
                   ) AS varchar2_table
                 )
          FROM   table_name
          WHERE  LENGTH(data) <= 3)
       );

然后你会得到错误:

ORA-22814: attribute or element value is larger than specified in type

因为您试图将

VARCHAR2(4)
值放入仅包含
VARCHAR2(3)
数据的集合中(即使我们已将值的大小限制为仅适合
VARCHAR2(3)
的值)。

我们可以通过添加另一个

CAST
来修复它,以确保这些值被视为
VARCHAR2(3)
(而不是
VARCHAR2(4)
):

SELECT COLUMN_VALUE
FROM   TABLE(
         (SELECT CAST(
                   COLLECT(
                     CAST(data AS VARCHAR2(3))
                     ORDER BY data
                   ) AS varchar2_table
                 )
          FROM   table_name
          WHERE  LENGTH(data) <= 3)
       );

那么输出是:

COLUMN_VALUE
X
XX
XXX

小提琴

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.