Таблица удаления Oracle, если она существует, выдает ошибку, начинающуюся со строки 1: в команде

#sql #oracle #if-statement #compiler-errors #drop-table

#sql #Oracle #если-заявление #ошибки компилятора #выпадающий стол

Вопрос:

Мы пытаемся удалить все таблицы в базе данных, а затем создать их снова, но oracle выдает ошибку. отчет об ошибке является:

 Error report - ORA-06550: line 12, column 1: PLS-00103: Encountered the symbol "CREATE"  06550. 00000 - "line %s, column %s:n%s" *Cause: Usually a PL/SQL compilation error. *Action:  

и код такой:

 BEGIN  EXECUTE IMMEDIATE 'DROP TABLE ' || EMPLOYEE;  EXECUTE IMMEDIATE 'DROP TABLE ' || ADDRESS;  EXCEPTION  WHEN OTHERS THEN  IF SQLCODE != -942 THEN  RAISE;  END IF; END;  CREATE TABLE EMPLOYEE(  EmployeeID int,  FirstName varchar(225),  LastName varchar(255),  Position varchar(255),  SSN int,  Address varchar(255),  Phone int,  AddressID int,    PRIMARY KEY (EmployeeID),  FOREIGN KEY (AddressID) REFERENCES ADDRESS(AddressID) );  CREATE TABLE ADDRESS(  AddressID int,  Street varchar(225),  City varchar(225),  State varchar(225),  Zip int );  

Мы хотим сделать это для всех таблиц, но пока это не работает для двух таблиц, которые мы пытаемся удалить в начале.

Ответ №1:

Должно было быть так:

 SQLgt; BEGIN  2 BEGIN  3 EXECUTE IMMEDIATE 'DROP TABLE EMPLOYEE';  4 EXCEPTION  5 WHEN OTHERS THEN  6 IF sqlcode != -942 THEN  7 RAISE;  8 END IF;  9 END;  10  11 BEGIN  12 EXECUTE IMMEDIATE 'DROP TABLE ADDRESS';  13 EXCEPTION  14 WHEN OTHERS THEN  15 IF sqlcode != -942 THEN  16 RAISE;  17 END IF;  18 END;  19  20 END;  21 /  PL/SQL procedure successfully completed.  

 SQLgt; CREATE TABLE ADDRESS(  2 AddressID int primary key,  3 Street varchar(225),  4 City varchar(225),  5 State varchar(225),  6 Zip int  7 );  Table created.  SQLgt; CREATE TABLE EMPLOYEE(  2 EmployeeID int,  3 FirstName varchar(225),  4 LastName varchar(255),  5 Position varchar(255),  6 SSN int,  7 Address varchar(255),  8 Phone int,  9 AddressID int,  10 PRIMARY KEY (EmployeeID),  11 FOREIGN KEY (AddressID) REFERENCES ADDRESS(AddressID)  12 );  Table created.  SQLgt;  

Что ты сделал не так?

  • имена таблиц должны быть заключены в одинарные кавычки с помощью динамического SQL, потому что — если они не существуют, код завершится ошибкой
  • заключите каждый динамический оператор SQL в свой собственный BEGIN-EXCEPTION-END блок, чтобы избежать проблем, когда одна из таблиц существует (а другая нет).
  • завершите блок PL/SQL косой чертой (строка #11); в противном случае некоторые инструменты (например, SQL*Plus) не смогут выполнить весь код в виде сценария
  • сначала создайте ADDRESS таблицу (и добавьте ограничение первичного ключа, потому что в противном случае включение внешнего ключа EMPLOYEE завершится ошибкой).

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

1. Спасибо! Внесли изменения, и когда мы создаем таблицы, oracle выдает «ORA-00955: имя уже используется существующим объектом». Не уверен, что это должно произойти, так как первый блок кода работает, и он должен был удалить таблицу АДРЕСОВ?

2. Я не знаю, что вы сделали (так как вы никогда не публиковали это). Я несколько раз перезапускал код, который опубликовал , и каждый раз он выполнялся успешно.

3. Это может привести к ошибке при создании АДРЕСА, если изначально АДРЕС существует, а СОТРУДНИК нет.

4. Правильно, @Serg. Спасибо вам за то, что вы используете свой мозг (в то время как я не использую свой). Но если каждый динамический оператор SQL заключен в свой собственный блок «НАЧАЛО-ИСКЛЮЧЕНИЕ-КОНЕЦ», то он работает нормально. Код теперь исправлен и протестирован. Еще раз спасибо!

5. Это сработало, спасибо!

Ответ №2:

Попробуйте поменять местами таблицы СОЗДАНИЯ, потому что вы пытаетесь использовать ВНЕШНИЙ КЛЮЧ (адрес), к которому в момент создания невозможно получить доступ.

 CREATE TABLE ADDRESS( ...  CREATE TABLE EMPLOYEE( ...