Процедура удаления — ORA-00933 — команда SQL не завершена должным образом

#c# #oracle

Вопрос:

Я хочу поместить процедуры в базу данных по щелчку мыши в C#.

Файл Sql: EXP_DROP_PROCEDURES.sql

 drop procedure EXP_NAMES; drop procedure EXP_TYPS; drop procedure EXP_CARS; drop procedure EXP_SHIPS;  

Код C#:

 try  {  // Geht die SQL Skript in Basei  var statement = File.ReadAllText(AppDomain.CurrentDomain.BaseDirectory   "\"   "sql"   "\"   "EXP_DROP_PROCEDURES.sql");  using (OracleCommand cmd = new OracleCommand(statement, oraCon))  {  cmd.CommandType = CommandType.Text;  cmd.ExecuteNonQuery();  }   }  catch (Exception ex)  {  MessageBox.Show(ex.Message);  }  

Я попытался зафиксировать; в конце EXP_DROP_PROCEDURES.sql и либо без точки с запятой. И то, и другое не сработало. Это всегда приводит меня к тому, что команда ORA-00933 — SQL с исключением не завершена должным образом.

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

1. Скорее всего, вам придется выполнять оператор один за другим в цикле или сделать его одним блоком PL/SQL execute immediate

2. Вы пытались удалить только последнюю точку с запятой и оставить другую?

3. @Steve В Oracle одна команда может содержать только один оператор.

4. Хорошо, просто подумал, что точки с запятой должны ставиться только между командами. Но довольно неудобно, если вы спросите меня.

5. @Steve Это предотвращает множество уязвимостей для инъекций SQL, и вы можете обернуть несколько операторов в блок PL/SQL и передать его как одну команду, чтобы «неудобства», как вы выразились, были минимальными.

Ответ №1:

В Oracle одна команда может содержать только один оператор.

Вам либо нужно:

  • прочитайте каждую строку из файла и выполните их как отдельные команды (без конечной точки с запятой); или
  • оберните операторы SQL в анонимный блок PL/SQL (и используйте EXECUTE IMMEDIATE , так как вы не можете использовать DROP операторы непосредственно в PL/SQL):
     BEGIN  EXECUTE IMMEDIATE 'DROP PROCEDURE EXP_NAMES';  EXECUTE IMMEDIATE 'DROP PROCEDURE EXP_TYPS';  EXECUTE IMMEDIATE 'DROP PROCEDURE EXP_CARS';  EXECUTE IMMEDIATE 'DROP PROCEDURE EXP_SHIPS'; END;  

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

1. снова чему-то научился, большое вам спасибо! ^^