ORA-00907: rechter haakje ontbreekt

Ik heb de afgelopen twee dagen naar deze code gekeken en ik krijg het niet voor elkaar. Het geeft me steeds

ORA-00907: missing right parenthesis.

Ik weet dat dit een onderwerp is dat veel naar voren komt, maar om de een of andere reden heeft geen van de voorbeelden die ik heb gezien me geholpen. Kan iemand mij vertellen waarom ik deze fout heb gekregen en hoe ik deze kan oplossen? Ik ben er vrij zeker van dat het niets te maken heeft met mijn haakjes, misschien zijn het mijn BEPERKINGEN?

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);

Hier zijn de resultaten die ik krijg wanneer ik de code uitvoer:

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.               

Antwoord 1, Autoriteit 100%

ORA-00907: Missing Circleheshesis

Dit is een van de verschillende generieke foutmeldingen die aangeven dat onze code een of meer syntaxisfouten bevat. Soms kan het betekenen dat we letterlijk een juiste beugel hebben weggelaten; Dat is gemakkelijk genoeg om te verifiëren of we een editor gebruiken die een Match Bracket -capaciteit heeft (de meeste teksteditors die gericht zijn op coders doen). Maar vaak betekent het dat de compiler een trefwoord uit de context heeft tegengekomen. Of misschien is het een verkeerd gespeld woord, een ruimte in plaats van een onderstrepingsteken of een ontbrekende komma.

Helaas de mogelijke redenen waarom onze code niet compileert, is vrijwel oneindig en de compiler is gewoon niet slim genoeg om ze te onderscheiden. Dus het heeft een generieke, enigszins cryptisch, bericht zoals ORA-00907: missing right parenthesisen laat het aan ons om de werkelijke bloeier te herkennen.

Het gepost script heeft verschillende syntaxisfouten. Eerst zal ik de fout bespreken die triggert die ORA-0097, maar je moet ze allemaal oplossen.

Buitenlandse sleutelsbeperkingen kunnen worden gedeclareerd in overeenstemming met de kolom Referencing of op het tabelniveau nadat alle kolommen zijn aangegeven. Deze hebben verschillende syntaxis; Je scripts mengen de twee en daarom krijg je de ORA-00907.

In-line declaratie heeft geen komma en bevat niet de verwijzende kolomnaam.

CREATE TABLE historys_T    (
    history_record    VARCHAR2 (8),
    customer_id       VARCHAR2 (8) 
          CONSTRAINT historys_T_FK FOREIGN KEY REFERENCES T_customers ON DELETE CASCADE,
    order_id           VARCHAR2 (10) NOT NULL,
          CONSTRAINT fk_order_id_orders REFERENCES orders ON DELETE CASCADE)

Beperkingen op tabelniveau zijn een afzonderlijk onderdeel, en hebben dus een komma en vermelden wel de verwijzende kolom.

CREATE TABLE historys_T    (
    history_record    VARCHAR2 (8),
    customer_id       VARCHAR2 (8),    
    order_id           VARCHAR2 (10) NOT NULL,
    CONSTRAINT historys_T_FK FOREIGN KEY (customer_id) REFERENCES T_customers ON DELETE CASCADE,   
   CONSTRAINT fk_order_id_orders FOREIGN KEY (order_id) REFERENCES orders ON DELETE CASCADE)

Hier is een lijst met andere syntaxisfouten:

  1. De tabel waarnaar wordt verwezen (en de primaire sleutel of de unieke beperking waarnaar wordt verwezen) moet al bestaan voordat we er een externe sleutel voor kunnen maken. U kunt dus geen externe sleutel maken voor HISTORYS_Tvoordat u de tabel ORDERSwaarnaar wordt verwezen, heeft gemaakt.
  2. Je hebt de namen van de tabellen waarnaar wordt verwezen verkeerd gespeld in sommige clausules van de refererende sleutel (LIBRARY_Ten FORMAT_T).
  3. U moet een expressie opgeven in de DEFAULT-clausule. Voor DATE-kolommen is dat meestal de huidige datum, DATE DEFAULT sysdate.

kijken naar onze eigen code met een koel oog is een vaardigheid die we allemaal moeten winnen om succesvol te zijn als ontwikkelaars. Het helpt echt bekend te zijn met de documentatie van Oracle. Een vergelijking van uw code en de voorbeelden in de SQL-referentie zouden u hebben geholpen om deze syntaxisfouten in aanzienlijk minder dan twee dagen op te lossen. vind het hier (11g) en hier (12c) .

Evenals syntaxisfouten bevatten uw scripts ontwerpfouten. Dit zijn geen storingen, maar slechte praktijk die geen gewoonten mag worden.

  1. U hebt de meeste van uw beperkingen niet genoemd. Oracle geeft ze een standaardnaam, maar het is een vreselijke, en maakt het gegevenswoordenboek moeilijker om te begrijpen. Expliciet het noemen van elke beperking helpt ons bij het navigeren van de fysieke database. Het leidt ook tot meer begrijpelijke foutmeldingen wanneer onze SQL een beperking overtredingen.
  2. Noem uw beperkingen consequent. HISTORY_Theeft beperkingen die historys_T_FKen fk_order_id_orders, geen van beiden nuttig zijn. Een nuttige conventie is <child_table>_<parent_table>_fk. Dus history_customer_fken history_order_fkrespectievelijk.
  3. Het kan handig zijn om de beperkingen met afzonderlijke uitspraken te maken. Het maken van tabellen en primaire toetsen dan Buitenlandse sleutels vermijden de problemen met de hierboven geïdentificeerde afhankelijkheidsbewijs.
  4. Je probeert cyclische externe sleutelste maken tussen LIBRARY_Ten FORMATS. Je zou dit kunnen doen door de beperkingen in een aparte instructie te maken, maar doe dat niet: je zult problemen hebben bij het invoegen van rijen en nog erger problemen met verwijderingen. U moet uw gegevensmodel heroverwegen en een manier vinden om de relatie tussen de twee tabellen te modelleren, zodat de ene de ouder is en de andere het kind. Of misschien heb je een ander soort relatie nodig, zoals een intersectietabel.
  5. Vermijd lege regels in uw scripts. Sommige tools kunnen ze aan, maar andere niet. We kunnen SQL*Plus configureren om ze af te handelenmaar het is beter om de noodzaak te vermijden.
  6. De naamgevingsconventie van LIBRARY_Tis lelijk. Probeer een meer expressieve naam te vinden die geen onnodig achtervoegsel nodig heeft om een trefwoordconflict te voorkomen.
  7. T_CUSTOMERSis zelfs nog lelijker, omdat het niet consistent is met uw andere tabellen en ook volledig onnodig is, aangezien customersgeen sleutelwoord is.

Dingen benoemen is moeilijk. Je zou de ruzies die ik in de loop der jaren heb gehad over tafelnamen niet geloven. Het belangrijkste is consistentie. Als ik naar een datadictionary kijk en tabellen zie met de namen T_CUSTOMERSen LIBRARY_T, zou mijn eerste reactie verwarring zijn. Waarom worden deze tabellen met verschillende conventies genoemd? Welk conceptueel verschildrukt dit uit? Dus, alsjeblieft, beslis over een naamgevingsconventie en houd je eraan. Maak uw tabelnamen ofwel allemaal enkelvoud of allemaal meervoud. Vermijd voor- en achtervoegsels zoveel mogelijk; we weten al dat het een tabel is, we hebben geen T_of een _TABnodig.


Antwoord 2, autoriteit 17%

Ik zou aanraden om alle buitenlandse toetsbeperkingen uit uw CREATE TABLEuitspraken te maken. Maak eerst alle tabellen zonder FK-beperkingen en maak vervolgens alle FK-beperkingen als u de tabellen hebt gemaakt.

U kunt een FK-beperking toevoegen aan een tabel met behulp van SQL zoals het volgende:

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

In het bijzonder, uw formatsen libraryTables hebben beide Buitenlandse-KEY-beperkingen op elkaar. De twee CREATE TABLEVerklaringen om deze twee tabellen te maken, kunnen nooit met succes worden uitgevoerd, omdat elk alleen werkt wanneer de andere tabel al is gemaakt.

Het scheiden van de Creër-creatie kunt u tafels maken met FK-beperkingen op elkaar. Ook, als u een foutmelding hebt met een beperking, wordt alleen die beperking niet gecreëerd. Omdat u op dit moment fouten hebt in de beperkingen in uw CREATE TABLEVerklaringen maken, mislukt de hele tabelcreatie en krijgt u verschillende knock-on-fouten omdat FK-beperkingen kunnen afhangen van deze tabellen die niet kunnen maken.


Antwoord 3

zij het van de nutteloze _Ten onjuist gespeld geschiedenissen. Als u SQL*Plusgebruikt, accepteert het geen Create Tabel-verklaringen met lege nieuwe regels tussen create table <name> (en kolomdefinities.


Antwoord 4

Ten eerste, in Histories_t, verwijst u tabel T_CUSTOMER (moet T_Customers) en ten tweede mist u de buitenlandse sleutelclausule die verwijzingen van bestellingen; die niet wordt gemaakt (of gedaald) met de code die u hebt opgegeven.

Er kunnen ook aanvullende fouten zijn, en ik geef Oracle toe dat Oracle nooit erg goed is geweest in het beschrijven van de oorzaak van fouten – “mutating tafels” is een zaak in punt.

Laat het me weten of er extra problemen die je mist.

Other episodes