#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. снова чему-то научился, большое вам спасибо! ^^