Oracle Dual表的使用

Oracle Dual表的使用

Dual在oracle中的使用非常频繁,看到别人使用,有点疑惑。为啥要偏偏使用这张表呢?
今天就这个疑问baidu了下。现在总结一下。

1.Dual是一张系统表(有人称其为:虚拟表),只有一个字段:DUMMY VARCHAR2(1)允许为空
2.因为在DBMS中查询语句需要:select from 表这种结构,所以当查询系统时间,虚拟字段,oracle函数调用时,
为了构造select from 这种结构,我们常常使用dual表,比如
No1:select sysdate from dual
No2:select fun_common_test(66) from dual
3. Dual只有一条数据。我在PL/SQL修改Dual表添加一条数据时,
系统会报"权限不足"的错误。所以可以给变量赋值的时候直接
4.用SELECT计算常量表达式、伪列等值时常用该表,因为它只返回一行数据,而使用其它表时可能返回多个数据行(貌似与第2条重复)
No1:select 3+4 from dual


dual表的一种巧妙使用:
情况:
在存储过程活着函数中给变量赋值,
如果查询无结果的话,
select into 语句会报错:
oracle01403:未找到数据错误。

select CBIC_SC_VALUE
into RED_FLAG
from cbizconfig
where CBIC_ORG_ID = 66
and CBIC_SC_CODE = 'QUERY_RED_WHEN_INVOICE';

查询无记录,赋值就会报错。
处理方法1:判断查询的记录,如果记录小于1时,不进行赋值的操作:
select count(*)
into ICOUNT
from cbizconfig
where CBIC_ORG_ID = 66
and CBIC_SC_CODE = 'QUERY_RED_WHEN_INVOICE';

if ICOUNT > 0 then
select CBIC_SC_VALUE
into RED_FLAG
from cbizconfig
where CBIC_ORG_ID = 66
and CBIC_SC_CODE = 'QUERY_RED_WHEN_INVOICE';
end if;

第2种办法:

Select
(select CBIC_SC_VALUE from cbizconfig
where CBIC_ORG_ID = 66
and CBIC_SC_CODE = 'QUERY_RED_WHEN_INVOICE') into RED_FLAG

from dual
这样巧妙的避开了无记录赋值的情况。
--这种写法还需要好好的领会。

你可能感兴趣的:(数据结构,oracle,sql)