Получение «отсутствующего или недопустимого параметра» при запуске этого скрипта

#sql #oracle #oracle-apex

#sql #Oracle #oracle-apex

Вопрос:

Я получаю «отсутствующую или недопустимую опцию» при запуске этого скрипта (полная ошибка: ORA-00922: отсутствует или недопустимая опция ORA-06512: в «SYS.WWV_DBMS_SQL_APEX_200100», строка 581 ORA-06512: в «SYS.DBMS_SYS_SQL», строка 1658 ORA-06512: в «SYS.WWV_DBMS_SQL_APEX_200100», строка 567 ORA-06512: в «APEX_200100.WWV_FLOW_DYNAMIC_EXEC», строка 2127). Рассматриваемое утверждение — «СОЗДАТЬ ПРОИЗВОДИТЕЛЯ ТАБЛИЦЫ (m_name VARCHAR2 (50), m_id». Что я должен сделать, чтобы это исправить?

 DROP TABLE vehicles CASCADE constraints;
DROP TABLE suppliers CASCADE constraints;
DROP TABLE manufacturer CASCADE constraints;

CREATE TABLE vehicles
    (VIN        VARCHAR2(17),
     brand      VARCHAR2(20),
     model      VARCHAR2(20),
     color      VARCHAR2(10),
     PRIMARY KEY (VIN, brand, model, color)
    );

CREATE TABLE suppliers
    (s_name     VARCHAR2(20), 
     s_id       VARCHAR2(15), 
     part_id    VARCHAR2(20),
     supply_date    VARCHAR2(15),    
     PRIMARY KEY (s_name, s_id, part_id, supply_date)
    );

CREATE TABLE manufacturer
    (m_name     VARCHAR2(50), 
     m_id       VARCHAR2(15), 
     s_name     VARCHAR2(20),
     VIN        VARCHAR2(17)),
     PRIMARY KEY (m_name, m_id)),
      FOREIGN KEY (s_name) REFERENCES suppliers
        ON DELETE SET NULL
     FOREIGN KEY (VIN) REFERENCES vehicles
        ON DELETE SET NULL
    );


--LOAD DATABASE

INSERT INTO vehicles VALUES ('JM1CW2BL4D0154490', 'Mazda', 'Mazda5', 'Brown');
INSERT INTO suppliers VALUES ('MNAO Supplier', 'MNAO', '308', '01/28/2013');
INSERT INTO manufacturer VALUES ('Mazda Motor Corp', 'MZDAY', 'MNAO Supplier', 'JM1CW2BL4D0154490');


  

Комментарии:

1. У вас есть несколько дополнительных закрывающих круглых скобок, которых там не должно быть, как в PRIMARY KEY (m_name, m_id)) . Тогда определение внешних ключей недопустимо SQL: вам необходимо указать имена столбцов в родительской таблице, например: FOREIGN KEY (s_name) REFERENCES suppliers(s_name) ON DELETE SET NULL . Но даже в этом случае: внешние ключи неверно сформированы: вы можете ссылаться только на первичный ключ (или набор уникальных столбцов) в родительской таблице, а это не то, что вы здесь делаете. Вероятно, вам нужно переосмыслить свой дизайн.

2. Ах, спасибо. Я не уловил скобки. Я также исправил внешние ключи и настроил новый дизайн с «ОГРАНИЧЕНИЕМ», рекомендованным MT0.

Ответ №1:

Идентификационный номер транспортного средства (VIN) уникален; вам не нужны никакие другие столбцы для создания первичного ключа, чтобы ваша vehicles таблица могла быть:

 CREATE TABLE vehicles(
  VIN   VARCHAR2(17)
        CONSTRAINT vehicles__vin__pk PRIMARY KEY,
  brand VARCHAR2(20)
        CONSTRAINT vehicles__brand__nn NOT NULL,
  model VARCHAR2(20)
        CONSTRAINT vehicles__model__nn NOT NULL,
  color VARCHAR2(10)
        CONSTRAINT vehicles__color__nn NOT NULL
);
  

Аналогично, вы, вероятно, хотите использовать только один столбец в качестве первичного ключа suppliers (и должны хранить значения даты в качестве DATE типа данных):

 CREATE TABLE suppliers (
  s_name      VARCHAR2(20)
              CONSTRAINT suppliers__s_name__pk PRIMARY KEY,
  s_id        VARCHAR2(15)
              CONSTRAINT suppliers__s_id__nn NOT NULL,
  part_id     VARCHAR2(20)
              CONSTRAINT suppliers__part_id__nn NOT NULL,
  supply_date DATE
              CONSTRAINT suppliers__supply_date__nn NOT NULL
);
  

Тогда ваша manufacturer таблица может быть:

 CREATE TABLE manufacturer(
  m_name     VARCHAR2(50), 
  m_id       VARCHAR2(15), 
  s_name     VARCHAR2(20)
             CONSTRAINT manufacturer__s_name__fk
               REFERENCES suppliers (s_name) ON DELETE SET NULL,
  VIN        VARCHAR2(17)
             CONSTRAINT manufacturer__vin__fk
               REFERENCES vehicles (vin) ON DELETE SET NULL,
  CONSTRAINT manufacturer__m_name__m_id__pk PRIMARY KEY (m_name, m_id)
);
  

(Опять же, вы, вероятно, захотите изменить его, чтобы только один столбец был первичным ключом.)

Затем вы можете вставить свои данные:

 INSERT INTO vehicles VALUES ('JM1CW2BL4D0154490', 'Mazda', 'Mazda5', 'Brown');
INSERT INTO suppliers VALUES ('MNAO Supplier', 'MNAO', '308', DATE '2013-01-28');
INSERT INTO manufacturer VALUES ('Mazda Motor Corp', 'MZDAY', 'MNAO Supplier', 'JM1CW2BL4D0154490');
  

(и не передавайте даты в виде строк, используйте TO_DATE или литерал даты.)

db<> скрипка здесь

Комментарии:

1. Большое вам спасибо! Я планирую реализовать больше запросов и использовать этот метод. Сегодня я, конечно, узнал кое-что новое.