Вызовите Oracle процедуру из C#, когда процедура находится в другой схеме - PullRequest
0 голосов
/ 09 января 2020

Я пытаюсь вызвать довольно простую процедуру, и если я в редакторе Toad, она работает нормально:

BEGIN OtherSchema.P_CloseBatch('BatchName'); END;

Эта схема имеет разрешения на выполнение P_CloseBatch, который существует в OtherSchema.

Я подключаюсь в C# к той же схеме, используя этот код:

try 
{ 
    using (OracleConnection connection = new OracleConnection(oracleStgConnectionString))
    {
          connection.Open();
          OracleCommand command = new OracleCommand();
          command.Connection = connection;
          command.CommandType = CommandType.StoredProcedure;
          command.CommandText = "BEGIN OtherSchema.P_CloseBatch('BatchName'); END;";
          command.ExecuteNonQuery();
          connection.Close();
     }
}
catch (Exception e)
{
     Log.Info(e.Message);
}

И когда я получаю команду. ExecuteNonQuery, это дает мне длинную ошибку:

{"ORA-06550: строка 1, столбец 83: \ nPLS-00103: обнаружен символ \") \ "при ожидании одного из следующих действий: \ n \ n (- + case mod new not null \ n \ n продолжить среднее число текущих существует макс. мин. до sql стандартное отклонение \ n отклонение суммы выполнить интервал времени слияния времени слияния \ n дата \ n pipe \ n \ n

Все мои поиски выглядят так этот CommandText подходит, но это не так. Все, что я могу думать, это то, что он находится в другой схеме. Это проблема, или есть что-то еще, чего я не вижу?

Если вместо значения CommandText выше, у меня есть следующее вместо:

command.CommandText = "OtherSchema.P_CloseBatch('BatchName')";

Тогда ошибка или я получаю:

  • $ исключение {"ORA-06550: строка 1, столбец 7: \ nPLS-00801: внутренняя ошибка [22503] \ nORA-06550: строка 1, столбец 7: \ nPL / SQL: оператор игнорируется "} Oracle .ManagedDataAccess.Client.OracleException

Я могу разделить его так, чтобы текст команды был отдельным, а имя пакета добавляется в качестве параметра:

 connection.Open();
 OracleCommand command = new OracleCommand();
 command.Connection = connection;
 command.CommandType = CommandType.StoredProcedure;
 command.CommandText = "OtherSchema.P_CloseBatch(:batchname)";
 String parameterBatchName = "BatchName";
 command.Parameters.Add(new OracleParameter(":batchname", parameterBatchName ));
 command.ExecuteNonQuery();
 connection.Close();

И эта ошибка "+ $ исключение {" ORA-01008: не все переменные связаны "} Oracle .ManagedDataAccess.Client.OracleException"

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

1 Ответ

2 голосов
/ 09 января 2020

Когда вы указываете CommandType.StoredProcedure, CommandText должно быть именем процедуры, а не сценарием PL / SQL. Параметр передается в коллекцию Parameters.

using (OracleConnection connection = new OracleConnection(oracleStgConnectionString))
using (OracleCommand command = connection.CreateCommand())
{
    connection.Open();

    command.BindByName = true;
    command.CommandType = CommandType.StoredProcedure;
    command.CommandText = "OtherSchema.P_CloseBatch";

    command.Parameters.Add(new OracleParameter()
    {
        ParameterName = "batchname",
        OracleDbType = OracleDbType.NVarchar2
        Value = parameterBatchName
    });

    command.ExecuteNonQuery();

    // Call to connection.Close removed as the "using" block already does that.
}

Я внес несколько других изменений:

  • Создано command с использованием connection.CreateCommand потому что он назначает соединение перед возвратом объекта.

  • A using блок на command, потому что он также одноразовый.

  • Настройка BindByName поэтому имя параметра, которое я указываю, на самом деле что-то значит.

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