C#执行SQL脚本删Oracle存储过程报ORA-00933错误如何解决
解决方案
错误根因
OracleCommand 默认不支持直接执行多条以分号分隔的SQL语句,你直接读取整个SQL文件的内容传入命令对象时,Oracle解析器无法识别多语句拼接的格式,因此抛出ORA-00933 SQL命令未正确结束异常。你之前尝试的添加commit、移除分号的操作没有命中核心问题,因此无法解决报错。
可选解决方案
方案1:拆分SQL语句逐条执行
无需修改SQL文件,仅调整C#逻辑,将读取到的SQL内容按分号拆分后过滤空内容,逐条执行即可:
try { var sqlContent = File.ReadAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "sql", "EXP_DROP_PROCEDURES.sql")); // 按分号拆分所有SQL语句 var sqlStatements = sqlContent.Split(';', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); foreach (var statement in sqlStatements) { using (OracleCommand cmd = new OracleCommand(statement, oraCon)) { cmd.CommandType = CommandType.Text; cmd.ExecuteNonQuery(); } } } catch (Exception ex) { MessageBox.Show(ex.Message); }
注意这里用了
Path.Combine拼接路径,避免不同系统下路径分隔符不兼容的问题。
方案2:用PL/SQL匿名块包装多语句
无需修改C#代码,仅修改EXP_DROP_PROCEDURES.sql内容,将所有DDL语句用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; /
因为DDL语句无法直接在PL/SQL块中执行,需要用
EXECUTE IMMEDIATE动态执行。
内容的提问来源于stack exchange,提问作者user9715288
相关产品推荐
相关产品推荐

