Question

Par exemple

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>
Était-ce utile?

La solution

Si vous voulez utiliser une instruction SELECT où une seule valeur est autorisée, vous devez mettre cette instruction SELECT entre parenthèses:

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

Cela pourrait être prolongé pour plusieurs colonnes:

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

Vous avez juste besoin de faire en sorte que les SELECT renvoie exactement une rangée et une colonne exactement

Autres conseils

penser sans savoir (je ne fais pas Oracle alors ne pas une boîte pour essayer ceci sur) que le problème est ici:

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

Essayez ceci:

insert into dates (d) 
select sysdate fom dual

Parce que la parenthèse indique la grammaire que la valeur à l'intérieur des paren est une valeur, et non une déclaration de valeur de production. Je suppose que, si vous voulez vraiment une explication plus approfondie que je pourrais aller chercher que pour vous dans la spécification du langage SQL.

Je suppose qu'il est juste un fait historique.

Il est tout simplement pas encore fait de cette façon.

A partir de SQL Server, je sais qu'ils libèrent de telles restrictions entre 2005 et 2008 et nous pas de refuge souvent des problèmes lorsque nous courons ces scripts en 2005.

Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top