5 votes

Erreur SQL : ORA-00922 : option manquante ou non valide

CREATE TABLE vol charter (num_vol NUMBER(4) PRIMARY KEY
, id_client NUMBER(6) REFERENCES client(id_client)
, num_avion NUMBER(4) REFERENCES avion(num_avion)
, type_vol VARCHAR2 (12)
, date_vol DATE NOT NULL
, heure_vol INTERVAL DAY TO SECOND NOT NULL
, decollage CHAR (3) NOT NULL
, destination CHAR (3) NOT NULL)

Ne devrais-je pas utiliser le type de données CHAR?

J'ai entendu dire que c'est une mauvaise pratique de l'utiliser mais je voulais que decollage et destination aient au moins 3 caractères car ce sont des codes d'aéroport.

Voici l'erreur que je reçois:

Erreur à la ligne de commande : 1 Colonne : 23
Rapport d'erreur :
Erreur SQL : ORA-00922: option manquante ou non valide
00922. 00000 -  "option manquante ou non valide"
*Cause:
*Action:

7voto

Justin Cave Points 114578

L'erreur que vous obtenez semble être due au fait qu'il n'y a pas de tiret bas entre "chartered" et "flight" dans le nom de la table. Je suppose que vous voulez quelque chose comme ceci où le nom de la table est chartered_flight.

CREATE TABLE chartered_flight(flight_no NUMBER(4) PRIMARY KEY
, customer_id NUMBER(6) REFERENCES customer(customer_id)
, aircraft_no NUMBER(4) REFERENCES aircraft(aircraft_no)
, flight_type VARCHAR2 (12)
, flight_date DATE NOT NULL
, flight_time INTERVAL DAY TO SECOND NOT NULL
, takeoff_at CHAR (3) NOT NULL
, destination CHAR (3) NOT NULL)

Généralement, il n'y a aucun avantage à déclarer une colonne comme CHAR(3) plutôt que VARCHAR2(3). Déclarer une colonne comme CHAR(3) ne force pas à avoir trois caractères de données (utiles). Cela dit simplement à Oracle de remplir les données avec moins de trois caractères avec des espaces pour atteindre trois caractères. Il est peu probable que cela soit utile si quelqu'un entre accidentellement un code incorrect. Potentiellement, vous pourriez déclarer la colonne comme VARCHAR2(3) et ajouter une contrainte CHECK que LENGTH(takeoff_at) = 3.

CREATE TABLE chartered_flight(flight_no NUMBER(4) PRIMARY KEY
, customer_id NUMBER(6) REFERENCES customer(customer_id)
, aircraft_no NUMBER(4) REFERENCES aircraft(aircraft_no)
, flight_type VARCHAR2 (12)
, flight_date DATE NOT NULL
, flight_time INTERVAL DAY TO SECOND NOT NULL
, takeoff_at CHAR (3) NOT NULL CHECK( length( takeoff_at ) = 3 )
, destination CHAR (3) NOT NULL CHECK( length( destination ) = 3 )
)

Étant donné que à la fois takeoff_at et destination sont des codes d'aéroport, vous devriez vraiment avoir une table séparée de codes d'aéroport valides et définir des contraintes clés étrangères entre la table chartered_flight et cette nouvelle table airport_code. Cela garantit que seuls les codes d'aéroport valides sont ajoutés et facilite grandement les choses si un code d'aéroport change à l'avenir.

Et du point de vue de la convention de nommage, vu que à la fois takeoff_at et destination sont des codes d'aéroport, je suggérerais que les noms soient complémentaires et indiquent ce fait. Quelque chose comme departure_airport_code et arrival_airport_code, par exemple, serait beaucoup plus significatif.

2voto

StevieG Points 6382

Il n'y a rien de mal à utiliser CHAR de cette manière.. Je pense que votre problème est que vous avez un espace dans le nom de votre table. Il devrait être: charteredflight ou chartered_flight..

2voto

a1ex07 Points 23965

Vous ne devriez pas utiliser de caractère espace lors du nommage des objets de base de données. Même s'il est possible en utilisant des guillemets doubles (identifiants cités), CREATE TABLE "chartered flight" ..., ce n'est pas recommandé. Jetez un coup d'œil de plus près ici

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X