2010-03-30 6 views
1

Я пытаюсь создать тестовую среду для тестирования приложения с сервером oracle и sql. Цель состоит в том, чтобы иметь одну и ту же базу кода для обоих тестовых сценариев, единственной разницей должны быть некоторые операторы SQL/DDL/..., которые хранятся в файлах сценариев. Проблема в том, что ODP оракула не поддерживает выполнение скриптов, а только отдельные команды.Выполнение скрипта sql oracle с нечетным командным объектом od.: Взаимные исключительные сообщения об ошибках

Я нашел обходной путь, но есть еще один вопрос, который я не могу решить:

Моей Капли сценарий оракул выглядит следующим образом:

BEGIN EXECUTE IMMEDIATE 'SELECT ''DROP TABLE '' || table_name || '' CASCADE CONSTRAINTS;'' FROM user_tables'; EXECUTE IMMEDIATE 'SELECT ''DROP SEQUENCE '' || sequence_name || '';'' FROM user_sequences;'; 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.) 

я получаю исключение брошенного оракула ODP .Net объект команды, если я обеспечиваю точку с запятой:

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

Есть ли способ, чтобы удовлетворить обоих, базы данных Oracle и ODP .Net?

ответ

2

Я думаю, что проблема с точкой с запятой может фактически находиться во втором выполнении немедленного действия. Когда вы выполняете SQL в непосредственном выполнении так, что положить точку с запятой в конце строки приведет к ошибке.

Однако этот блок PL/SQL на самом деле ничего не сделает. Выдача выборок внутри блока PL/SQL без предложения INTO запускает запрос, но ничего не делает с результатами. Я думаю, что вы действительно хотите что-то вроде этого:

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. Вы должны иметь возможность передать блок в базу данных в виде строки без каких-либо изменений.

+0

Спасибо Аллан, это прекрасно работает. Я просто добавил дополнительный запуск немедленного «вокруг вашего кода и заменил его на», чтобы иметь возможность выполнять его с ODP .NET. – phatoni