Как перебрать массив в хранимой процедуре, вернуть массив? - PullRequest
1 голос
/ 05 августа 2011

Часть хранимой процедуры, которую я пишу (в БД Oracle), вернет массив целочисленных значений приложению c #. Я никогда не делал этого раньше, и я не могу найти информацию в Интернете о том, как сделать это внутри хранимой процедуры.

На стороне C # я подключился к БД и создал команду хранимой процедуры. Я использую:

cmd.Parameters.Add("returnID", OracleDbType.Array, ParameterDirection.Output);

Чтобы получить массив.

Внутри хранимой процедуры, у меня есть:

CREATE OR REPLACE PROCEDURE ODM(/* not relevant*/, returnIDs OUT ARRAY)
IS
BEGIN
...
END ODM;

Где returnIDs - это массив, который я хочу вывести, полный целых чисел.

Мне нужно иметь возможность перебирать таблицу ORDERS и захватывать все целочисленные первичные ключи между двумя значениями и добавлять их в returnID.

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

Каков синтаксис, чтобы можно было объявлять эти значения, проходить по таблице и добавлять в мой выходной массив?

РЕДАКТИРОВАТЬ: решение: Bulk Collect будет работать для этого, но гораздо проще просто вернуть минимальные и максимальные значения в мою программу, а затем просто сделать отдельный выбор там.

Ответы [ 3 ]

5 голосов
/ 05 августа 2011

Я не уверен, что вам нужно зациклить.В зависимости от определения типа ARRAY вы, вероятно, можете просто

SELECT primary_key
  BULK COLLECT INTO returnIDs
  FROM orders
 WHERE primary_key BETWEEN low_value AND high_value
3 голосов
/ 05 августа 2011

Итак, что вам нужно знать, это:

  1. мы можем вставить в массив, используя Oracle массовый сбор синтаксис
  2. мы можем присвоить каждой строке уникальный номер, используя агрегатную функцию ROW_NUMBER () .

Объедините их в функцию PL / SQL, например:

SQL> create or replace type numbers_nt as table of number
  2  /

Type created.

SQL> create or replace function get_range_of_numbers
  2    (p_start in pls_integer
  3      , p_end in pls_integer )
  4     return  numbers_nt
  5  is
  6    rv numbers_nt ;
  7  begin
  8      select empno
  9      bulk collect into rv
 10      from
 11          ( select empno
 12                   , row_number() over (order by empno asc) rn
 13            from emp )
 14      where rn between p_start and p_end;
 15      return rv;
 16  end;
 17  /

Function created.

SQL> 

Давай качаться!

    SQL> select *
      2  from table(get_range_of_numbers(5, 8))
      3  /

    COLUMN_VALUE
    ------------
            7654
            7698
            7782
            7788

    SQL>

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

create or replace function get_range_of_numbers
  (p_start in pls_integer
    , p_end in pls_integer )
   return  numbers_nt 
is
  rv numbers_nt ;
begin
    select empno
    bulk collect into rv
    where emp between p_start and p_end;
    return rv;
end;
/
0 голосов
/ 05 августа 2011

Мой опыт работы с БД в основном связан с SQL Server и Firebird, и я не опытный оракул.Однако мне было просто любопытно, разве вы не можете просто выбрать значения и вернуть их как простой набор данных или набор данных в приложение C #, тогда вы можете либо сохранить их в datatable, либо преобразовать их в массив или коллекцию в приложении C #тебе нравится?

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