Te traemos la solución a este atascamiento, o por lo menos eso deseamos. Si sigues con alguna inquietud compártelo en un comentario, que con gusto te ayudaremos
Solución:
De Wikipedia:
La tabla DUAL es una tabla especial de una fila presente de forma predeterminada en todas las instalaciones de bases de datos de Oracle. Es adecuado para usar en la selección de una pseudocolumna como SYSDATE o USER. La tabla tiene una única columna VARCHAR2(1) llamada DUMMY que tiene un valor de ‘X’.
Por lo tanto, la tabla dual es una forma de realizar operaciones contra lo que equivale a ser un vacío pero no null mesa. Esto es útil cuando a uno no le importa la tabla, pero necesita realizar operaciones a través de una declaración de selección. Si la tabla tuviera más de una fila o columna, se devolverían múltiples resultados (debido a que se opera sobre todo el conjunto de tuplas al realizar la operación).
No debe usarse en producción, a menos que necesite invocar específicamente ciertos procedimientos a través de SQL.
4*5
es una operación matemática, al igual que 'Foo'
es un string. Por lo tanto, al igual que uno puede seleccionar 4*5 de cualquier tabla, al igual que uno puede seleccionar ‘Foo’ de cualquier tabla, DUAL es una forma de seleccionarlo de una tabla conocida que nunca tendrá múltiples resultados.
De la documentación (CONCEPTOS):
DUAL es una pequeña tabla en el diccionario de datos a la que Oracle Database y los programas escritos por el usuario pueden hacer referencia para garantizar un resultado conocido. La tabla dual es útil cuando un valor debe devolverse solo una vez, por ejemplo, la fecha y la hora actuales. Todos los usuarios de la base de datos tienen acceso a DUAL.
La tabla DUAL tiene una columna llamada DUMMY y una fila que contiene el valor X.
Y la referencia de SQL:
DUAL es una tabla creada automáticamente por Oracle Database junto con el diccionario de datos. DUAL está en el esquema del usuario SYS pero es accesible por el nombre DUAL para todos los usuarios. Tiene una columna, DUMMY, definida como VARCHAR2(1), y contiene una fila con un valor X. La selección de la tabla DUAL es útil para calcular una expresión constante con la instrucción SELECT. Debido a que DUAL tiene solo una fila, la constante se devuelve solo una vez. Como alternativa, puede seleccionar una constante, una pseudocolumna o una expresión de cualquier tabla, pero el valor se devolverá tantas veces como filas haya en la tabla. Consulte “Acerca de las funciones SQL” para ver muchos ejemplos de cómo seleccionar un valor constante de DUAL.
A partir de Oracle Database 10g versión 1, la E/S lógica no se realiza en la tabla DUAL cuando se calcula una expresión que no incluye la columna DUMMY. Esta optimización aparece como FAST DUAL en el plan de ejecución. Si SELECCIONA la columna DUMMY de DUAL, esta optimización no se lleva a cabo y se produce la E/S lógica.
DUAL
es una tabla que tiene exactamente una fila como lo mostrará la siguiente instrucción SQL:
SELECT * FROM dual;
Tu dual2
la tabla no tiene filas. Si inserta uno, verá el mismo comportamiento.
4*5 es una expresión que Oracle puede evaluar sin usar datos de la tabla. Lo evaluará una vez por cada fila, tal como lo haría con una expresión de columna normal. Entonces, si no hay una fila, no se devuelve ningún resultado, si hay dos filas, obtendrá el 20 dos veces.
los dual
mesa “funciona” casi tal como funciona cualquier otra tabla: es una tabla desde la que puede seleccionar registros.
Esto significa, por ejemplo, que puede describir la tabla. Aquí en SQL*Plus
:
SQL> set lines 50
SQL> desc dual
Name Null? Typ
----------------------- -------- ----------------
DUMMY VARCHAR2(1)
Entonces, la tabla tiene una columna, llamada dummy
el cual es un varchar2(1)
.
La tabla tiene, por diseño, un registro (al menos si nadie lo manipula):
SQL> select count(*) from dual;
COUNT(*)
----------
1
Entonces, para obtener el mismo comportamiento con dual2
como tienes con dual
, tienes que insertar un registro en dual. Mejor aún, créalo con un create table as select
(ctas):
SQL> create table dual2 as select * from dual;
Ahora, su consulta funciona:
SQL> select 4*5 from dual2;
4*5
----------
20
Anteriormente, dije que dual casi funciona como cualquier otra mesa. Entonces, Cuándo ¿No funciona como cualquier otra mesa?
Se comporta de manera diferente, si no se selecciona ningún valor de la propia tabla. Nuevamente, con sus consultas, dejo que Oracle explicar ellos …
SQL> set lines 150
SQL> explain plan for select 4*5 from dual2;
EXPLAIN PLAN ausgef³hrt.
… para ver cómo se accede a la tabla:
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------
Plan hash value: 3445655939
-------------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time |
-------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 3 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| DUAL2 | 1 | 3 (0)| 00:00:01 |
-------------------------------------------------------------------
Se puede ver que la afirmación hace un full table access
en dual2
.
Ahora, lo mismo con dual
:
SQL> explain plan for select 4*5 from dual;
EXPLAIN PLAN ausgef³hrt.
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
-------------------------------------------------------------------
Plan hash value: 1388734953
-----------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time |
-----------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 2 (0)| 00:00:01 |
| 1 | FAST DUAL | | 1 | 2 (0)| 00:00:01 |
-----------------------------------------------------------------
Aquí es donde el dual
la tabla se comporta de manera diferente: el valor de dummy
no es necesario, por lo que un fast dual
se ejecuta la operación, para que la instancia no lea el valor real en el disco.
Tienes la posibilidad dar difusión a esta crónica si lograste el éxito.