【问题标题】:ORA-00922: missing or invalid option | SQL*PLUS commands using OracleClientORA-00922: 缺少或无效选项 |使用 OracleClient 的 SQL*PLUS 命令
【发布时间】:2012-08-16 06:50:39
【问题描述】:
    OracleConnection conn = new OracleConnection();
    conn.ConnectionString = @"Data Source=(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 10.206.0.23)(PORT = 1521)))(CONNECT_DATA = (SID = ORCLWEX3)));User Id= RAMNIVAS_CI;Password= RAMNIVAS_CI;";
    conn.Open();


    SetStatus(null, "CLEARING CI DATABASE");
    OracleCommand com = new OracleCommand(@"set pages 0
                    set lines 80
                    spool c:\delete_objects_CI
                    select 'drop '||object_type||' '||object_name||';'
                    from user_objects;
                    spool off
                    start c:\delete_objects_CI.lst
                    purge recyclebin;
                    set pages 100", conn);
    com.ExecuteNonQuery();

我想我尝试执行的查询有问题。

【问题讨论】:

    标签: c# oracle ado.net oracleclient


    【解决方案1】:

    您不能使用 Oracle 客户端执行 SQL*plus 命令。只有 SQL*plus 和一些 Oracle 工具(如 SQL Developer)支持 SQL*plus 命令。

    您的代码基本上会遍历当前用户的所有对象,然后删除它们。您应该能够通过循环实现相同的目的:

    OracleCommand userObjCmd = new OracleCommand("select object_type, object_name from user_objects", conn);
    OracleDataReader reader = command.ExecuteReader();
    while (reader.Read())
    {
        OracleCommand dropCmd = new OracleCommand(
            String.Format(@"execute immedidate 'drop {0} \"{1}\"'",
                reader.GetValue(0), reader.GetValue(1)),
            conn);
        dropCmd.ExecuteNonQuery();
    }
    

    您需要添加一些代码来正确关闭命令和读取器实例以及处理错误。

    而且您可能需要静默丢弃错误并尝试多次重复上述代码,直到所有对象都已成功删除,因为只要其他对象依赖它,某些对象就无法删除。

    【讨论】:

    • 谢谢,即使我使用您的方法删除对象,问题是我必须恢复该数据库(我们有 DMP 和文本文件)并使用 SQL PLUS 进行备份。有什么办法吗?
    • DMP 文件是来自 exp 还是 expdp 实用程序?你有什么样的文本文件来恢复数据库?您想如何使用 SQLplus 备份数据库?不管怎样,最好的方法是在单独的进程中运行 SQLplus、imp、impdb 等。
    【解决方案2】:

    您正试图通过您的驱动程序执行 SQL*Plus 命令。我不认为这是可以做到的。

    【讨论】:

    • 那么有什么方法可以使用我的驱动程序来完成同样的任务吗?我认为上面的脚本只是清除了指定数据库中的所有内容。
    • 最好的方法是删除用户并重新创建它。当父表在子表之前被删除时,当索引被删除并且索引不存在时,上述方法会出错,因为表被删除等等。另一种方法是编写一个存储过程来清除所有内容并从代码中调用它。
    • 我认为我们没有权限删除用户并重新创建它。你能告诉我任何其他方法吗?
    猜你喜欢
    • 2014-10-14
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-04
    • 2021-04-05
    相关资源
    最近更新 更多