Создайте и скомпилируйте хранимую процедуру «на лету» в oracle из C # /. Net - PullRequest
2 голосов
/ 14 мая 2011

Я знаю, что об этом спрашивали до , но эти решения, похоже, не работают со мной.

В настоящее время я пытаюсь сделать это:

  1. Создайте строку сценария «CREATE PROCEDURE» для oracle
  2. . Создайте команду SQL, используя корпоративную библиотеку 5.0, и передайте эту строку в качестве параметра
  3. Сохраните процедуру в базе данных oracle

Так что пункт 3, похоже, работает до сих пор, если я открою SQL Developer и разверну список дерева процедур, тогда я смогу увидеть процедуру, но с красным кружком, что означает, что она имеет ошибки компилятора, хотя и выполняет тот же код, которыйдовольно маленький, в окне запросов SQL Developer работает нормально и компилирует его.Я не уверен, что в SQL Developer что-то скрыто происходит, потому что запуск этого скрипта «CREATE PROCEDURE» не выдает никакой ошибки, я могу затем увидеть и выполнить процедуру, но не так, как это делается на C #.

Я прочиталв ссылке, размещенной в начале этого, я должен вызывать IDBCommand.Prepare(), но этот метод уместен только в том случае, если ваш SQLCommand.CommandType имеет тип StoredProcedure, и поскольку я на самом деле не вызываю процедуру, а выполняю чистый sql для СОЗДАНИЯ процедурытогда это не сработает, тем не менее, я просто ради тестирования создал новую команду, которую я назначил StoredProcedure, а затем вызвал метод Prepare () для этой команды, наконец, метод ExecuteNonQuery(), который выдает исключениеобъект (хранимая процедура) недоступен, что имеет смысл, поскольку он не был скомпилирован ...

Итак, мне интересно, знает ли кто-нибудь, как можно создать процедуру и скомпилировать ее из C #, мыв настоящее время используют корпоративную библиотеку, но я бы не отказалсяng "что-то напрямую провайдеру оракула, пока он работает.

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

Ответы [ 3 ]

2 голосов
/ 14 мая 2011

Я немного заржавел и сейчас у меня нет доступа к Oracle, но я думаю, что знаю, о чем ты просишь. Вы хотите использовать класс ADO.NET OracleCommand и оператор Oracle EXECUTE IMMEDIATE. Примерно так:

        OracleConnection conn = new OracleConnection("Data Source=something; user id=something; Password=something;");
        conn.Open();
        OracleCommand command = new OracleCommand();
        command.CommandType = CommandType.Text;
        command.CommandText = "execute immediate 'create or replace procedure [...you know this part...]' ";
        command.Connection = conn;
        command.ExecuteNonQuery();
        conn.Close();
    }

Это должно работать. Но учтите, что я всегда использовал ODP.NET (собственный поставщик данных Oracle) вместо стандартного ADO.NET, поэтому могут быть некоторые небольшие различия, если вы просто используете стандартную библиотеку.

Как предположил Пит, вы также можете использовать динамический SQL с тем же эффектом. Вы бы передали весь оператор CREATE PROCEDURE в качестве параметра существующей хранимой процедуре, которая затем вызывает EXECUTE IMMEDIATE для вас. Однако я не верю, что вы должны делать это таким образом. Вышеуказанное должно работать, если вы хотите сохранить его минимальным.

Еще одна вещь. Я не знаю, почему это происходит, но если Oracle говорит вам, что процедура недействительна, даже если вы знаете, что все в порядке, попробуйте выполнить

EXECUTE IMMEDIATE ALTER PROCEDURE schemaname.procedurename COMPILE;

Я часто обнаруживал, что Oracle немного хрупок в том, что касается ненужной аннулирования объектов.

1 голос
/ 14 мая 2011

Если вы хотите динамически выполнять операторы DDL в SQL Server или Oracle, вы должны передать созданный в C # DDL процедуре в Oracle, которая затем будет использовать EXECUTE IMMEDIATE для запуска строки в качестве команды и создания процедура.

На этой странице из Oracle упоминается, что вам придется использовать динамический sql, если "вы хотите выполнять операторы DDL и другие операторы SQL, которые не поддерживаются в чисто статических программах SQL".

Надеюсь, это вам поможет.

0 голосов
/ 15 мая 2011

Какой последний персонаж?

Оригинальный SQL * Plus от Oracle использует символ косой черты для выполнения текущей команды. Многие IDE используют одно и то же или интерпретируют косую черту как не являющуюся частью процедуры / пакета

Так что, если у вас есть косая черта (на новой строке) в конце строки 'CREATE ...', то это будет ошибкой. Однако, если он загружен средой IDE и перекомпилирован, среда IDE может удалить его для вас.

Выполните проверку USER_ERRORS после загрузки C # и посмотрите, не сообщается ли что-либо как неправильное с этим программным модулем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...