web-dev-qa-db-ja.com

ORA-00907:右括弧がありません

私は過去2日間このコードを見てきましたが、動作するように思えません。 ORA-00907: missing right parenthesis。これは非常に多く取り上げられるトピックであることは知っていますが、何らかの理由で、私が見た例はどれも私を助けてくれませんでした。このエラーが発生した理由と修正方法を教えてください。おそらく私の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);

コードを実行すると、次の結果が得られます。

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.               
6
user3806509

ORA-00907:右括弧がありません

これは、コードに1つ以上の構文エラーが含まれていることを示すいくつかの一般的なエラーメッセージの1つです。場合によっては、文字通り右角かっこを省略したことを意味する場合があります。これは、match bracket機能を備えたエディターを使用しているかどうかを確認するのに十分簡単です(ほとんどのテキストエディターはコーダー向けです)。しかし、多くの場合、コンパイラはコンテキストから外れたキーワードに遭遇したことを意味します。または、スペルミスのWord、アンダースコアの代わりのスペース、またはコンマの欠落です。

残念ながら、アウトコードがコンパイルされない理由として考えられるものは事実上無限であり、コンパイラーはそれらを区別するのに十分ではありません。そのため、ORA-00907: missing right parenthesisのような一般的でやや不可解なメッセージを投げかけ、実際のブルーマーを見つけるためにそれを残します。

投稿されたスクリプトには、いくつかの構文エラーがあります。まず、そのORA-0097をトリガーするエラーについて説明しますが、すべてを修正する必要があります。

外部キー制約は、参照列に沿って、またはすべての列が宣言された後にテーブルレベルで宣言できます。これらには異なる構文があります。スクリプトでこの2つを混ぜると、ORA-00907が取得されます。

行内宣言にはコンマがなく、参照列名は含まれません。

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)

テーブルレベルの制約は個別のコンポーネントであるため、カンマがあり、参照列に言及しています。

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)

他の構文エラーのリストは次のとおりです。

  1. 参照されるテーブル(および参照される主キーまたは一意制約)は、それらに対して外部キーを作成する前に既に存在している必要があります。そのため、参照されるORDERSテーブルを作成する前にHISTORYS_Tの外部キーを作成することはできません。
  2. いくつかの外部キー句(LIBRARY_TおよびFORMAT_T)で参照されているテーブルの名前のスペルを間違えました。
  3. DEFAULT句に式を指定する必要があります。通常現在の日付であるDATE列の場合、DATE DEFAULT sysdate

自分のコードをクールな目で見ることは、開発者として成功するために必要なスキルです。オラクルのドキュメントに精通していると本当に助かります。コードとSQ​​Lリファレンスの例を並べて比較することで、これらの構文エラーを2日以内に解決できました。 ここで見つける(11g) および ここで(12c) .

構文エラーに加えて、スクリプトには設計ミスが含まれています。これらは失敗ではなく、習慣になるべきではない悪い習慣です。

  1. ほとんどの制約に名前を付けていません。 Oracleはそれらにデフォルト名を付けますが、それは恐ろしい名前になり、データ辞書を理解しにくくします。すべての制約に明示的に名前を付けると、物理データベースをナビゲートするのに役立ちます。
  2. 一貫して制約に名前を付けます。 HISTORY_Tにはhistorys_T_FKおよびfk_order_id_ordersという制約がありますが、どちらも役に立ちません。便利な規則は<child_table>_<parent_table>_fkです。 history_customer_fkhistory_order_fkです。
  3. 別々のステートメントで制約を作成すると便利です。テーブルを作成してから主キーを作成し、次に外部キーを作成すると、上記の依存関係の順序付けに関する問題を回避できます。
  4. LIBRARY_TFORMATSの間に循環外部キーを作成しようとしています。別のステートメントで制約を作成することでこれを行うことができますが、しないでください。行を挿入するときに問題が発生し、削除に関するさらに悪い問題が発生します。データモデルを再検討し、2つのテーブル間の関係をモデル化して、一方が親、他方が子になるようにする方法を見つける必要があります。または、交差テーブルなど、別の種類の関係が必要な場合があります。
  5. スクリプト内の空白行を避けてください。一部のツールはそれらを処理しますが、一部は処理しません。 それらを処理するようにSQL * Plusを構成する ができますが、必要がない方が良いです。
  6. LIBRARY_Tの命名規則はいです。キーワードの衝突を避けるために不必要なサフィックスを必要としない、より表現力豊かな名前を見つけてください。
  7. T_CUSTOMERSはさらにく、customersはキーワードではないため、他のテーブルと一貫性がなく、完全に不要です。

ものに名前を付けるのは難しいです。あなたは私が長年にわたってテーブル名について持っていた悩みを信じないでしょう。最も重要なことは一貫性です。データディクショナリを見て、T_CUSTOMERSおよびLIBRARY_Tというテーブルが表示された場合、最初の応答は混乱しています。これらのテーブルの名前が異なるのはなぜですか?これはどのような概念的な違いを表していますか?それで、命名規則を決め、それに固執してください。テーブル名をすべて単数形またはすべて複数形にします。接頭辞と接尾辞をできるだけ避けます。テーブルであることは既にわかっているので、T__TABは必要ありません。

17
APC

すべての外部キー制約をCREATE TABLEステートメントから分離することをお勧めします。最初にすべてのテーブルをFK制約なしで作成し、テーブルを作成したらすべてのFK制約を作成します。

次のようなSQLを使用して、FK制約をテーブルに追加できます。

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

特に、formatsテーブルとlibraryテーブルの両方には、相互に外部キー制約があります。これら2つのテーブルを作成する2つのCREATE TABLEステートメントは、他のテーブルが既に作成されている場合にのみ機能するため、正常に実行できません。

制約の作成を分離すると、FK制約が相互に関係するテーブルを作成できます。また、制約にエラーがある場合、その制約のみの作成に失敗します。現時点では、CREATE TABLEステートメントの制約にエラーがあるため、テーブル全体の作成は失敗し、FK制約は作成に失敗したこれらのテーブルに依存する可能性があるため、さまざまなノックオンエラーが発生します。

3
Luke Woodward

まず、histories_Tでは、テーブルT_customer(T_customersである必要があります)を参照しています。次に、REFERENCESが順序付けするFOREIGN KEY句がありません。指定したコードでは作成(または削除)されていません。

同様に追加のエラーが発生する可能性がありますが、Oracleがエラーの原因を説明するのに苦労したことはありません。「テーブルの変更」がその典型です。

不足している追加の問題がある場合はお知らせください。

0
ron tornambe

役に立たない_Tと間違ったスペルの履歴からではありますが。 SQL*Plusを使用している場合、create table <name> (と列定義の間に空の改行があるcreate tableステートメントは受け入れません。

0
Michael-O