SQL> CONN /@YTK92 AS SYSDBA已连接。
SQL> SELECT * FROM DUAL;
D
-
X
SQL> INSERT INTO DUAL VALUES ('X');
已创建 1 行。
SQL> SELECT * FROM DUAL;
D
-
X
SQL> SELECT COUNT(*) FROM DUAL;
COUNT(*)
----------
2
SQL> ROLLBACK;
回退已完成。
SQL> SELECT * FROM V$VERSION;
BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production PL/SQL Release 9.2.0.4.0 - Production
CORE 9.2.0.3.0 Production
TNS for 32-bit Windows: Version 9.2.0.4.0 - Production
NLSRTL Version 9.2.0.4.0 - Production
在9i的SQL优化器中,Oracle知道DUAL表只有一条记录,因此即使插入新的记录后,SELECT * FROM DUAL仍然返回一条记录。
SQL> CONN /@YTK102 AS SYSDBA已连接。
SQL> SELECT * FROM DUAL;
D
-
X
SQL> INSERT INTO DUAL VALUES ('X');
已创建 1 行。
SQL> SELECT * FROM DUAL;
D
-
X
SQL> SELECT COUNT(*) FROM DUAL;
COUNT(*)
----------
1
SQL> SELECT * FROM V$VERSION;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production
可以看到,10g的优化器中即使是COUNT(*)查询,返回的总数也是1。
也就是说,没有办法通过SQL获得DUAL表中真正的记录数。
虽然SQL中没有办法,但是PL/SQL是可以的,否则也不会导致EXPDP等操作报错了。
SQL> BEGIN
2 FOR I IN (SELECT * FROM DUAL) LOOP
3 DBMS_OUTPUT.PUT_LINE(I.DUMMY);
4 END LOOP;
5 END;
6 /
X
X