1

我正在尝试构建一个测试环境来测试针对 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?

4

1 回答 1

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 实际上是您要查询的删除语句。

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

于 2010-03-30T16:38:21.363 回答