You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 11:24:04