Oracle SQL вставляет в таблицу идентификатор пользователя и значение списка строк - PullRequest
0 голосов
/ 02 мая 2019

Я хотел бы сделать следующее, но мне не хватает знаний Oracle SQL, чтобы сделать это.

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

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

Мои вопросы:

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

Как мне выполнить цикл по списку.

Я вижу много примеров, подобных этому:

FOR r IN ('The', 'Quick', 'brown', 'fox')
LOOP
    // Do stuff
END LOOP;

Значит ли это, что я должен предоставить свой список в виде одной строки с запятыми?Мне было интересно, есть ли другие способы сделать это.

Ответы [ 2 ]

1 голос
/ 02 мая 2019

Вот вариант (PL /) SQL, который вы можете рассмотреть.

Для целей тестирования я создал таблицу TEST, которая будет содержать пары ID - VALUE. Процедура принимает два параметра, оба являются строками:

  • ID будет общим для всех значений
  • VALUE - список значений через запятую. Несмотря на то, что вы можете передать коллекцию, я бы посоветовал вам использовать VARCHAR2, так как ее очень просто поддерживать

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

Хорошо, вот так:

SQL> create table test (id varchar2(10), value varchar2(20));

Table created.

SQL> create or replace procedure p_ins (par_id    in varchar2,
  2                                     par_value in varchar2)
  3  is
  4  begin
  5    insert into test (id, value)
  6      select par_id,
  7             trim(regexp_substr(par_value, '[^,]+', 1, level))
  8      from dual
  9      connect by level <= regexp_count(par_value, ',') + 1;
 10  end;
 11  /

Procedure created.

Тестирование:

SQL> begin
  2    p_ins('A', 'The, quick, brown fox, runs, or, whatever, it does');
  3  end;
  4  /

PL/SQL procedure successfully completed.

SQL> select * from test;

ID         VALUE
---------- --------------------
A          The
A          quick
A          brown fox
A          runs
A          or
A          whatever
A          it does

7 rows selected.
0 голосов
/ 02 мая 2019

Чтобы выполнить одну и ту же вставку N раз с N различными строками

string[] things = new[]{"foo", "bar", "baz");

SomeSqlCommand sql = new SomeSqlCommand("INSERT INTO table(a, b) VALUES(@a, @b)", "some connection string");
sql.Parameters.AddWithValue("@a", "fixed value");
sql.Parameters.AddWithValue("@b", "dummy value - will change in loop");

sql.Connection.Open();

foreach(string thing in things)
{
  sql.Parameters["@b"].Value = thing;
  sql.ExecuteNonQuery();
}

sql.Connection.Close();

Пропущено с использованием etc для ясности;Основная предпосылка: установить параметризованный SQL, установить значения параметров, выполнить, изменить значения, выполнить снова ...

Когда я использовал Oracle, названиям параметров предшествовал двоеточие;Понятия не имею, если это все еще правда.Считайте это псевдокодом (это больше похоже на синтаксис SQLServer) и объедините концепцию с вашим существующим стилем Oracle

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