Выполнение сценария oracle sql с объектом команды odp .net: взаимоисключающие сообщения об ошибках - PullRequest
1 голос
/ 30 марта 2010

Я пытаюсь создать тестовую среду для тестирования приложения на сервере Oracle и SQL Server. Цель состоит в том, чтобы иметь одинаковую кодовую базу для обоих тестовых сценариев, единственное отличие должно заключаться в некоторых операторах SQL / DDL / ..., которые хранятся в файлах сценариев. Проблема в том, что 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:

Хотя база данных оракула жалуется, если я не предоставляю точку с запятой в конце:

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 Ответ

2 голосов
/ 30 марта 2010

Я думаю, что проблема с точкой с запятой может фактически возникнуть во втором выполнении немедленно. Когда вы запускаете 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 - это операторы drop, к которым вы обращаетесь.

Добавлен комментарий : Вам не нужно заключать его в немедленный запуск, чтобы запустить его из .NET. Вы должны быть в состоянии передать блок в базу данных в виде строки без каких-либо изменений.

...