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 parenthesis
en 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:
- 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_T
voordat u de tabelORDERS
waarnaar wordt verwezen, heeft gemaakt. - Je hebt de namen van de tabellen waarnaar wordt verwezen verkeerd gespeld in sommige clausules van de refererende sleutel (
LIBRARY_T
enFORMAT_T
). - 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.
- 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.
- Noem uw beperkingen consequent.
HISTORY_T
heeft beperkingen diehistorys_T_FK
enfk_order_id_orders
, geen van beiden nuttig zijn. Een nuttige conventie is<child_table>_<parent_table>_fk
. Dushistory_customer_fk
enhistory_order_fk
respectievelijk. - 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.
- Je probeert cyclische externe sleutelste maken tussen
LIBRARY_T
enFORMATS
. 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. - 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.
- De naamgevingsconventie van
LIBRARY_T
is lelijk. Probeer een meer expressieve naam te vinden die geen onnodig achtervoegsel nodig heeft om een trefwoordconflict te voorkomen. T_CUSTOMERS
is zelfs nog lelijker, omdat het niet consistent is met uw andere tabellen en ook volledig onnodig is, aangeziencustomers
geen 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_CUSTOMERS
en 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 _TAB
nodig.
Antwoord 2, autoriteit 17%
Ik zou aanraden om alle buitenlandse toetsbeperkingen uit uw CREATE TABLE
uitspraken 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 formats
en library
Tables hebben beide Buitenlandse-KEY-beperkingen op elkaar. De twee CREATE TABLE
Verklaringen 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 TABLE
Verklaringen 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 _T
en onjuist gespeld geschiedenissen. Als u SQL*Plus
gebruikt, 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.