web-dev-qa-db-fra.com

ORA-00907: parenthèse droite manquante

Je regarde ce code depuis deux jours et je n'arrive pas à le faire fonctionner. Il continue à me donner ORA-00907: missing right parenthesis. Je sais que c'est un sujet qui revient souvent, mais pour une raison quelconque, aucun des exemples que j'ai vus ne m'a aidé. Quelqu'un peut-il me dire, s'il vous plaît, pourquoi j'ai eu cette erreur et comment puis-je la réparer? Je suis à peu près sûr que cela n'a rien à voir avec ma parenthèse, c'est peut-être mon CONSTRAINTS 

DROP TABLE T_customers CASCADE CONSTRAINTS;
DROP TABLE dvd_collection CASCADE CONSTRAINTS;
DROP TABLE vhs_collection CASCADE CONSTRAINTS;

CREATE TABLE T_customers   (


                           customer_id         VARCHAR2 (8) PRIMARY KEY,
                           last_name           VARCHAR2 (30) NOT NULL,
                           first_name          VARCHAR2 (20) NOT NULL,
                           street             VARCHAR2 (30) NOT NULL,
                           city               VARCHAR2 (30) NOT NULL,
                           state                 CHAR (2) NOT NULL,
                                    CHECK (state IN ('GA','DC','VA','NY')),
                           Zip_code           CHAR (5)
                                    CHECK (TO_NUMBER(Zip_code)
                              BETWEEN 10000 AND 27999),
                           home_phone         VARCHAR2 (12) UNIQUE,
                           work_phone         VARCHAR2 (12) UNIQUE,
                           email                 VARCHAR2 (95) NOT NULL);




CREATE TABLE historys_T    (

          history_record       VARCHAR2 (8),
          customer_id       VARCHAR2 (8), 
          CONSTRAINT historys_T_FK FOREIGN KEY (customer_id) REFERENCES T_customer
                                       ON DELETE CASCADE,
                           order_id           VARCHAR2 (10) NOT NULL,
                                 CONSTRAINT fk_order_id_orders  
                                       REFERENCES orders
                                       ON DELETE CASCADE);


CREATE TABLE orders     (

                           order_id           VARCHAR2 (10) PRIMARY KEY,
                           m_p_unique_id       VARCHAR2 (10),
                                    CONSTRAINT orders_FK FOREIGN KEY (m_p_unique_id) REFERENCES library (m_p_unique_id)
                           order_date          DATE DEFAULT);



CREATE TABLE library_T     (

                           m_p_unique_id       VARCHAR2 (10)  PRIMARY KEY,
                           movie_title         VARCHAR2 (80)  NOT NULL,
                           serial_number       VARCHAR2 (10)  NOT NULL,
                           movie_id_number   VARCHAR2 (10)  NOT NULL,
                           movie_cast        VARCHAR2 (100) NOT NULL,
                           movie_format    CHAR (3) NOT NULL, 
                                  CONSTRAINT library_FK REFERENCES formats (movie_format));

CREATE TABLE formats_T     (

                           movie_format      CHAR (3) PRIMARY KEY,
                           movie_title       VARCHAR2 (80) NOT NULL,
                           m_p_unique_id     VARCHAR2 (10) NOT NULL,
                                 CONSTRAINT format_FK  REFERENCES library (m_p_unique_id));



CREATE TABLE dvd_collection (      


                           m_p_unique_id       VARCHAR2 (10) NOT NULL,
                           serial_number       VARCHAR2 (10) NOT NULL,
                           movie_id_number  VARCHAR2 (10) NOT NULL,
                           movie_title         VARCHAR2 (80) NOT NULL,
                           movie_cast          VARCHAR2 (100) NOT NULL,
                           movie_format     VARCHAR2 (80) NOT NULL,
                           movie_rating    VARCHAR2 (6) NOT NULL,
                           movie_distributer    VARCHAR2 (30) NOT NULL,
                           movie_price         NUMBER (3,2) NOT NULL,
                           movie_length     NUMBER (3) NOT NULL,
                           movie_award         VARCHAR2 (175) NOT NULL,
                           movie_release       DATE); 


CREATE TABLE vhs_collection            
(

                           m_p_unique_id       VARCHAR2 (10)NOT NULL,
                           serial_number       VARCHAR2 (10) NOT NULL,
                           movie_id_number  VARCHAR2 (10) NOT NULL,
                           movie_title         VARCHAR2 (80) NOT NULL,
                           movie_cast        VARCHAR2 (100) NOT NULL,
                           movie_format    VARCHAR2 (80) NOT NULL,
                           movie_rating    VARCHAR2 (6) NOT NULL,
                           movie_distributer    VARCHAR2 (30) NOT NULL,
                           movie_price         NUMBER (3,2) NOT NULL,
                           movie_length     NUMBER (3) NOT NULL,
                           movie_award         VARCHAR2 (175) NOT NULL,
                           movie_release        DATE);

Voici les résultats obtenus lorsque je lance le code:

Table dropped.

Table dropped.

Table dropped.

Table created.

                                       ON DELETE CASCADE)
                                       *

ERROR at line 10:
ORA-00907: missing right parenthesis

                           order_date          DATE DEFAULT)
                           *

ERROR at line 6:
ORA-00907: missing right parenthesis

                                  CONSTRAINT library_FK REFERENCES formats (movie_format))
                                                                           *

ERROR at line 9:
ORA-00907: missing right parenthesis

                                 CONSTRAINT format_FK  REFERENCES library (m_p_unique_id))
                                                                          *

ERROR at line 6:
ORA-00907: missing right parenthesis
Table created.

Table created.               
3
user3806509

Voici une liste complète des erreurs:

  1. Les contraintes de clé étrangère nous obligent à désigner les colonnes de référence sur la table enfant ainsi que les colonnes référencées sur la table parent. Les déclarations de clé étrangère doivent donc ressembler à ceci: CONSTRAINT fk_order_id_orders FOREIGN KEY (order_id) REFERENCES orders (order_id) ON DELETE CASCADE
  2. La table référencée (et la clé primaire référencée ou la contrainte unique) doit déjà exister avant que nous puissions créer une clé étrangère à leur encontre. Par conséquent, vous ne pouvez pas créer de clé étrangère pour HISTORYS_T avant d'avoir créé la table référencée ORDERS.
  3. L'ordre des composants n'est pas arbitraire. Nous devons déclarer toutes les colonnes avant de déclarer les contraintes de niveau de table. Cela concerne à la fois les commandes et HISTORYS_T.
  4. Vous avez mal orthographié les noms des tables référencées dans certaines des clauses de clé étrangère (LIBRARY_T and FORMAT_T). 
  5. Vous devez fournir une expression dans la clause DEFAULT. Pour les colonnes DATE, il s’agit généralement de la date du jour, DATE DEFAULT sysdate.

Ce sont toutes des erreurs de syntaxe. Vous auriez perdu beaucoup moins de deux jours si vous aviez bien examiné la documentation d'Oracle. Trouvez-le ici .

En plus des erreurs, vos scripts contiennent des erreurs.

  1. Vous n'avez pas nommé la plupart de vos contraintes. Oracle leur donnera un nom par défaut mais ce sera un nom horrible, ce qui rend le dictionnaire de données plus difficile à comprendre. Nous devrions toujours nommer explicitement chaque contrainte.
  2. Il est utile de créer les contraintes avec des instructions séparées. Créer des tables puis des clés primaires puis des clés étrangères évitera les problèmes de classement des dépendances identifiés ci-dessus.
  3. Vous essayez de créer des clés étrangères cycliques entre LIBRARY_T et FORMATS. Vous pouvez le faire en créant les contraintes dans une instruction distincte, mais ce n’est pas le cas: vous aurez des problèmes lors de l’insertion de lignes et des problèmes encore plus graves de suppression. Vous devez reconsidérer votre modèle de données et trouver un moyen de modéliser la relation entre les deux tables afin que l’une soit le parent et l’autre l’enfant. Ou peut-être avez-vous besoin d'un type de relation différent, tel qu'une table d'intersection.
  4. La convention de nommage de LIBRARY_T est laide. Essayez de trouver un nom plus expressif qui ne nécessite pas de suffixe inutile pour éviter un conflit de mots-clés.
  5. T_CUSTOMERS est encore plus laid, étant à la fois incohérent avec vos autres tables et totalement inutile, car customers n'est pas un mot clé.
13
APC

Je recommanderais de séparer toutes les contraintes de clé étrangère de vos instructions CREATE TABLE. Créez d'abord toutes les tables sans contraintes FK, puis créez toutes les contraintes FK une fois que vous avez créé les tables.

Vous pouvez ajouter une contrainte FK à une table à l'aide de SQL, comme suit:

ALTER TABLE orders ADD CONSTRAINT orders_FK
  FOREIGN KEY (m_p_unique_id) REFERENCES library (m_p_unique_id);

En particulier, vos tables formats et library ont toutes deux des contraintes de clé étrangère. Les deux instructions CREATE TABLE permettant de créer ces deux tables ne peuvent jamais s'exécuter correctement, car chacune ne fonctionnera que si l'autre table a déjà été créée. 

Séparer la création de contraintes vous permet de créer des tables avec des contraintes FK les unes sur les autres. De plus, si vous rencontrez une erreur avec une contrainte, seule la création de cette contrainte est impossible. À l'heure actuelle, en raison d'erreurs dans les contraintes de vos instructions CREATE TABLE, la création de tables entières échoue et vous obtenez différentes erreurs en retour, car les contraintes FK peuvent dépendre de la création de ces tables.

2
Luke Woodward

En premier lieu, dans histories_T, vous référencez la table T_customer (il devrait s'agir de T_customers), puis, il vous manque la clause FOREIGN KEY que REFERENCES commande; qui n'est pas créé (ou supprimé) avec le code que vous avez fourni.

Il peut également y avoir des erreurs supplémentaires, et j’admets que Oracle n’a jamais été aussi doué pour décrire la cause de ces erreurs - «Mutating Tables» est un exemple typique.

Faites-moi savoir s'il vous manque des problèmes supplémentaires.

0
ron tornambe

Bien qu’à partir de _T inutile et d’histoires mal orthographiées. Si vous utilisez SQL*Plus, il n'accepte pas les instructions create table avec de nouvelles lignes vides entre create table <name> ( et les définitions de colonne.

0
Michael-O