使用odp .net命令对象执行oracle sql脚本:互斥错误消息

时间:2010-03-30 10:03:01

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

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

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

oracle的My 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?

1 个答案:

答案 0 :(得分:2)

我认为分号问题实际上可能存在于第二个执行立即。当你像这样在执行立即运行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运行它。您应该能够将该块作为字符串传递给数据库而不进行任何更改。