【问题标题】:Executing oracle sql script with odp .net command object: mutual exclusive error messages使用 odp .net 命令对象执行 oracle sql 脚本:互斥错误消息
【发布时间】:2010-03-30 10:03:01
【问题描述】:

我正在尝试构建一个测试环境来测试针对 oracle 和 sql server 的应用程序。目的是为两个测试场景提供相同的代码库,唯一的区别应该是存储在脚本文件中的一些 SQL/DDL/... 语句。问题是oracle的ODP不支持脚本的执行,只支持单条命令。

我找到了一种解决方法,但仍有一个问题我无法解决:

我的 oracle 的 Drop 脚本如下所示:

BEGIN EXECUTE IMMEDIATE 'SELECT ''DROP TABLE '' || table_name || '' CASCADE CONSTRAINTS;'' FROM  user_tables'; EXECUTE IMMEDIATE 'SELECT ''DROP SEQUENCE '' || sequence_name || '';'' FROM user_sequences;'; END[;]

问题是END后的最后一个分号:

如果我没有在末尾提供分号,Oracle 数据库会抱怨:

ORA-06550: line 1, column 208:
PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:
; <an identifier> <a double-quoted delimited-identifier>
The symbol ";" was substituted for "end-of-file" to continue.)

如果我提供分号,我会收到 oracle ODP .Net 命令对象引发的异常:

ORA-00911: invalid character
ORA-06512: at line 1 

有没有办法同时满足oracle数据库和ODP .Net?

【问题讨论】:

    标签: .net oracle ado odp.net ora-00911


    【解决方案1】:

    我认为分号问题实际上可能存在于第二个立即执行。当你像这样在execute immediate 中运行SQL 时,将分号放在字符串的末尾会导致错误。

    但是,这个 PL/SQL 块实际上不会做任何事情。在没有 INTO 子句的 PL/SQL 块内发出选择会运行查询,但对结果没有任何作用。我认为你真正想要的是这样的:

    DECLARE
       cursor cur_tables is 
          select 'drop table ' || table_name || ' cascade constraints' as qry
          from user_tables;
       cursor cur_sequences is 
          select 'drop sequence ' || sequence_name as qry
          from user_sequences;
    BEGIN
       for r_table in cur_tables loop
          execute immediate r_table.qry;
       end loop;
       for r_sequence in cur_sequences loop
          execute immediate r_sequence.qry;
       end loop;
    END;
    

    确实没有理由让选择动态化,因为它们并没有改变。您的动态 SQL 实际上是您要查询的 drop 语句。

    添加的评论:您不需要将其包装在执行立即数中即可从 .NET 运行它。您应该能够将块作为字符串传递给数据库,而无需进行任何更改。

    【讨论】:

    • 谢谢艾伦,这很好用。我刚刚在您的代码周围添加了一个额外的 begin execute immediate '' 并将 ' 替换为 '' 以便能够使用 ODP .NET 执行它
    猜你喜欢
    • 1970-01-01
    • 2019-06-28
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    相关资源
    最近更新 更多