#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( ...