Pregunta

Por ejemplo

SQL> create table dates(d date);

Table created.

SQL> insert into dates select sysdate from dual;

1 row created.

SQL> select * from dates;

D
---------
28-MAY-11

SQL> insert into dates (d) values (select sysdate fom dual);
insert into dates (d) values (select sysdate fom dual)
                              *
ERROR at line 1:
ORA-00936: missing expression


SQL>
¿Fue útil?

Solución

Si desea utilizar una instrucción SELECT, donde sólo se permite un único valor que necesita para poner esa instrucción SELECT entre paréntesis:

insert into dates (d)
values
( (select sysdate from dual) )

Eso podría ser ampliada en varias columnas:

insert into dates 
(
  id, 
  d,
  other_column
)
values
( 
  some_sequence.nextval, 
  (select sysdate from dual), 
  (select max(some_col) from other_table)
)

Sólo tiene que asegurarse de que la instrucción SELECT devuelve exactamente una fila y exactamente una columna

Otros consejos

pensar sin saber (no hacer Oracle así que no tienen una caja de probar esto en) que el problema está aquí:

insert into dates (d) values (select sysdate fom dual)
                              ^^^^^^ <- this isn't a date; it expects a date here

Pruebe esto en su lugar:

insert into dates (d) 
select sysdate fom dual

Debido a que el paréntesis indica la gramática que el valor dentro de los paréntesis de un valor, no una declaración de producción de valor. Supongo, si realmente desea una explicación más a fondo que podía ir y buscar que os está guardada en la especificación del lenguaje SQL.

Creo que es sólo un hecho histórico.

Es sólo que aún no hecho de esa manera.

A partir de SQL Server Yo sé que ellos son la liberación de tales restricciones entre 2005 y 2008 y que a menudo paso refugio en problemas cuando nos encontramos este tipo de scripts en 2005.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a dba.stackexchange
scroll top