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,存储,query,fun)