SQL> connect sys as sysdba  Connected.
  SQL> insert into dual values ( 'Y');     1 row created.  SQL> commit;     Commit complete.  SQL> select count(*) from dual;     COUNT(*)     ----------     2我在论坛上看到上面一段代码,我照着在自己机器上运行,
可得到的COUNT(*)是1,为什么?是我错还是上面代码中红色部分错?

解决方案 »

  1.   

     SQL> select count(*) from dual;      COUNT(*)      ----------      2
    我在论坛上看到上面一段代码,我照着在自己机器上运行, 
    可得到的COUNT(*)是1,为什么?是我错还是上面代码中红色部分错?
      

  2.   


    DUAL就是个一行一列的表,如果你往里执行insert、delete、truncate操作,就会导致很多程序出问题。结果也因sql*plus、pl/sql dev等工具而异。查询行数
    --在创建数据库之后,DUAL表中便已经被插入了一条记录。个人认为:DUMMY字段的值并没有什么关系,重要的是DUAL表中的记录数
    SQL> select count(*) from dual;
    COUNT(*)
    ----------
    1SQL> select * from dual;
    DUMMY
    -----
    X--插入数据,再查询记录,只返回一行记录
    SQL> insert into dual values (''Y'');
    1 row created.
    SQL> commit;
    Commit complete.
    SQL> insert into dual values (''X'');
    1 row created.
    SQL> insert into dual values (''Z'');
    1 row created.
    SQL> commit;
    Commit complete.
    SQL> select count(*) from dual;
    COUNT(*)
    ----------
    4
    SQL> select * from dual;
    DUMMY
    -----
    X/*
    --假我们插入一条数据,DUAL表不是返回一行,而是多行记录,那会是什么结果呢?
    SQL> insert into dual values(''Y'');
    1 行 已插入
    SQL> commit;
    提交完成
    SQL> select * from dual;
    DUMMY
    -----
    X
    Y
    SQL> select sysdate from dual;
    SYSDATE
    -----------
    2004-12-15
    2004-12-15这个时候返回的是两条记录,这样同样会引起问题。在通过使用
    select sysdate into v_sysdate from dual;
    来获取时间或者其他信息的存储过程来说,ORACLE会抛出TOO_MANY_ROWS(ORA-01422)异常。
    因此,需要保证在DUAL表内有且仅有一条记录。当然,也不能把DUAL表的UPDATE,INSERT,DELETE权限随意释放出去,这样对于系统是很危险的
    */
    Oracle Dual 表详解
    http://blog.csdn.net/tianlesoftware/archive/2009/11/03/4764326.aspx
      

  3.   

    我的工作中也遇到类似的现象。
    也是因为往dual表中插入多条数据后,出现了些问题。
    当你在删除表时,提示“非递归性的SQL错误”.
    后来查资料才知道是:dual表中有多条记录。
    还有:insert into dual values(1);
         ....
         insert into dual values(100);
    此时,使用 delete from dual 。只能删掉一条语句。
      

  4.   

    正解 通常dual应该只能由管理员进行管理,普通用户只能select,否则就很容易出现各种问题
      

  5.   

    dual 就是 一个行一列的虚拟表,一般select count(*) from dual;的话都是1,但是有些工具会是2或者3等等。
      

  6.   

    不要对DUAL系统表乱来
    更不要对不知道的表乱来
    否则在工作中会狠狠麻烦滴
      

  7.   

    也有可能因为你的DUAL表里本来就没东西
    select count(*) from dual;结果为0
    而你插入一条所以就为1而不是2了啊呵呵 两者都没错