1

我们知道“Dual”是一个临时表,它恰好包含 1 个名为“dummy”的列,它是具有 1 个单行的“varchar2(1)”类型。该记录的值为“X”。varchar2 的大小为 1,这意味着它不应允许多个字符。现在我的问题是:如果它是 varchar2 类型,那么为什么它可以临时保存任何数据类型并且如果我们插入超过 1 个(大小)的字符,它(双重)如何接受它?例子:

SQL> desc dual

 Name                            Null?    Type
 ------------------------------- -------- ----
 DUMMY                                    VARCHAR2(1)

SQL> select sysdate from dual;

SYSDATE
---------
22-JAN-13

SQL> select 5*5 result from dual;

   RESULT
---------
       25

SQL> select 'Ankita' as "Name" from dual;

Name
------
Ankita

显然“SYSDATE”是 DATE 类型(不是 varchar2),“RESULT”是 NUMBER 类型(不是 varchar2)。'Ankita' 也多于 1 个单个字符,即 6 个字符。这应该与 varchar2 仅持有 1 并且也支持 6 的结构相矛盾。

4

1 回答 1

0

仅当您从中提取数据时,列的类型和大小才会起作用。确实,如果您select使用该dummy列,它只会为您提供该列中的内容。

但是,当您选择与列数据无关的内容时,例如5*5or 'Ankita',它们没有这样的限制。

我认为您的误解源于您的片段:

为什么它可以临时保存任何数据类型并且如果我们插入超过 1 个(大小)的字符,它如何(双重)接受它?

事实是,专栏接受它。选择5*5不会尝试将该数据放入表中的某个位置,它只是按原样评估它。这与拥有一张桌子没有什么不同:

users:
    id
    name

并执行:

select 42, 3.14159, id, name from users

对于从中选择的每一行,您将看到常量值423.14159,以及从两个指定列中提取的数据。

于 2014-12-16T08:32:43.130 回答