Выполните функцию оракула, которая возвращает ссылочный курсор в C #

У меня есть пакет оракула с процедурой, в которой есть курсор на входе. Насколько я понимаю, это довольно стандартно.

Что мне не понравилось, так это то, что мне пришлось написать тонну кода, чтобы просто увидеть результат. Итак, я задал этот вопрос , и оказалось, что я могу получить то, что хочу, создав функцию, которая оборачивает процедуру.

Обновление: Похоже, мне больше не нужна эта функция, но, может быть, в любом случае стоит узнать, кому интересно узнать оригинальный вопрос и ответить на обновления.

Вот функция

FUNCTION GetQuestionsForPrint (user in varchar2)
  RETURN MYPACKAGE.refcur_question
AS  

    OUTPUT MYPACKAGE.refcur_question;

BEGIN 

      MYPACKAGE.GETQUESTIONS(p_OUTPUT => OUTPUT, 
      p_USER=> USER ) ;


  RETURN OUTPUT;
END;

и вот что я делаю выполнить его в SQL Developer

var r refcursor;
exec :r := mypackage.getquestionsForPrint('OMG Ponies');
print r;

Так что теперь я, вероятно, собираюсь добавить функции ForPrint ко всем моим процедурам.

Это заставило меня задуматься, возможно, функции - это то, что я хочу, и мне не нужны процедуры.

Чтобы проверить это, я попытался выполнить функцию из .NET, но я не могу это сделать. Это действительно так.

using (OracleConnection cnn = new OracleConnection("Data Source=Test;User Id=Test;Password=Test;"))
{
    cnn.Open();
    OracleCommand cmd = new OracleCommand("mypackage.getquestionsForPrint");
    cmd.CommandType = System.Data.CommandType.StoredProcedure;

    cmd.Parameters.Add ( "p_USER", "OMG Ponies");

    cmd.Connection = cnn;
    OracleDataReader rdr = cmd.ExecuteReader();

    while (rdr.Read())
    {
        Console.WriteLine(rdr.GetOracleValue(0));
    }

    Console.ReadLine();
}

Так что я понял ошибку.

getquestionsForPrint не является процедурой или не определена

Я также пытался выполнить ExecuteScalar с тем же результатом.

РЕДАКТИРОВАТЬ Принимая совет Slider345, я также пытался установить тип команды для текста и использовать следующую инструкцию и я получаю недопустимый оператор SQL

mypackage.getquestionsForPrint('OMG Poinies');

и

var r refcursor; exec :r :=  mypackage.getquestionsForPrint('OMG Poinies'); 

Использование вариации Абхи для текста команды

select mypackage.getquestionsForPrint('OMG Poinies') from dual

привело к

инструкции в «0x61c4aca5» ссылка на память в "0x00000ce1". память не может быть «прочитана».

Я просто лаю не то дерево?

Обновление Попытка добавить выходной параметр не помогает.

cmd.Parameters.Add(null, OracleDbType.RefCursor, ParameterDirection.Output);

Не уверен, какое имя должно быть , поскольку оно является возвращаемым значением функции (я пробовал пустую пустую строку, mypackage.getquestionsForPrint), но во всех случаях это просто приводит к

ORA -06550: строка 1, столбец 7: PLS-00306: неправильный номер или типы аргументы в призыве 'getquestionsForPrint'

Окончательное редактирование (надеюсь)

Очевидно, Гудди задал аналогичный вопрос через 3 месяца после этого. Он получил ответ

  • . Установите текст вашей команды в анонимный блок
  • . Привязайте параметр к курсору ссылки, задав направление вывода.
  • Вызов Выполнить без чтения.
  • Тогда используйте ваш параметр

using (OracleConnection cnn = new OracleConnection("Data Source=Test;User Id=Test;Password=Test;"))
{
    cnn.Open();
    OracleCommand cmd = new OracleCommand("mypackage.getquestionsForPrint");
    cmd.CommandType = CommandType.Text;

    cmd.CommandText = "begin " +
              "    :refcursor1 := mypackage.getquestionsForPrint('OMG Ponies') ;"  +
              "end;";

    cmd.Connection = cnn;
    OracleDataAdapter da = new OracleDataAdapter(cmd);
    cmd.ExecuteNonQuery();

    Oracle.DataAccess.Types.OracleRefCursor t = (Oracle.DataAccess.Types.OracleRefCursor)cmd.Parameters[0].Value;
    OracleDataReader rdr = t.GetDataReader();
    while(rdr.Read())
        Console.WriteLine(rdr.GetOracleValue(0));

    Console.ReadLine();
}

11
задан Community 23 May 2017 в 11:48
поделиться

1 ответ

Я предполагаю, что вы не можете вызвать функцию с объектом Command типа StoredProcedure. Можете ли вы попробовать объект Command типа «Текст» и выполнить функцию в тексте команды?

0
ответ дан 3 December 2019 в 11:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: