我正在尝试构建一个测试环境,以针对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?
答案 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运行它。您应该能够将该块作为字符串传递给数据库而不进行任何更改。