Intereting Posts
Как хранить массивы в базе данных? Обновление очистки для повторяющихся записей MySQL: ON UPDATE CASCADE для простой таблицы «id | parent | text», не возможно? Эффективный способ конвертировать секунды в минуту и ​​секунды в sql server 2005 Как я могу присоединиться к двум таблицам, но только возвращать строки, которые не совпадают? отображение столбца без агрегата в группе по запросу в SQL SQL Injection этический хакер SQLiteException с использованием WHERE "+ KEY_Date +" = '"+ date +"' " Добавить описание дела в разделе Where простой SQL-запрос, объединить результаты и разделить SQL Server 2008: у меня 1000 таблиц, мне нужно знать, какие таблицы имеют данные Python, SQL: задайте столбцы, считанные как параметр sqlite3 запрос по max и фильтр вторым фактором Вставка каждой ДРУГИХ строк из одной таблицы в другую (VBA MS Access 2010) MYSQL – получить минимальную ставку из таблицы по продукту (результаты странные)

Разделить разделительную строку с разделителями на несколько столбцов и создать записи

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

1. p_ReqIDs VARCHAR2 2. p_ItemIDs VARCHAR2 3. p_Qtys VARCHAR2 

Вышеуказанные 3 строковые переменные содержат значения, разделенные точкой с запятой, такие как:

 p_ReqIDs := "56;56;56;" p_ItemIDs := "3;2;1;" p_Qtys := "400;300;200;" 

Мне нужно разделить значения и создать такие строки:

 p_ReqIDs p_ItemIDs p_Qtys ------------------------------------ 56 3 400 56 2 300 56 1 200 

Мне нужен запрос, который также разбивается и вставляется в таблицу.

благодаря

Вы можете обрабатывать параметры следующим образом:

 SQL> declare 2 type l_rec_type is record( 3 r_ReqIDs varchar2(31), 4 r_ItemIDs varchar2(31), 5 r_Qtys varchar2(31) 6 ); 7 8 type l_rec_list is table of l_rec_type; 9 -- your parameters. 10 l_ReqIDs constant varchar2(31) := '56;56;56;'; 11 l_ItemIDs constant varchar2(31) := '3;2;1;'; 12 l_Qtys constant varchar2(31) := '400;300;200;'; 13 14 l_rec l_rec_list; 15 begin 16 17 with Parameters(param) as( 18 select l_ReqIDs from dual union all 19 select l_ItemIDs from dual union all 20 select l_Qtys from dual 21 ), 22 Occurrences(oc) as( 23 select level 24 from ( select max(regexp_count(param, '[^;]+')) moc 25 from parameters) s 26 connect by level <= s.moc 27 ) 28 select max(res1) 29 , max(res2) 30 , max(res3) 31 bulk collect into l_rec 32 from (select decode(param, l_ReqIDs, res) res1 33 , decode(param, l_ItemIDs,res) res2 34 , decode(param, l_Qtys, res) res3 35 , rn 36 from ( select param, regexp_substr(param, '[^;]+', 1, o.oc) res 37 , row_number() over(partition by param order by param) rn 38 from parameters p 39 cross join occurrences o 40 ) 41 ) 42 group by rn; 43 44 for i in l_rec.first..l_rec.last 45 loop 46 dbms_output.put_line(l_rec(i).r_ReqIDs || ' ' || l_rec(i).r_ItemIDs || ' ' || l_rec(i).r_Qtys); 47 end loop; 48 end; 49 / 56 2 200 56 1 300 56 3 400 PL/SQL procedure successfully completed 

Если вам нужно просто вставить обработанные данные в таблицу, потребуется только insert into оператор и запрос ( bulk collect into l_rec должен быть удален):

 insert into your_table(<<columns>>) with Parameters(param) as( select l_ReqIDs from dual union all select l_ItemIDs from dual union all select l_Qtys from dual .... -- the rest of the query from the above pl/sql block. 

Вы также можете вставить всю запись в таблицу (в случае, если вам нужно выполнить дополнительную обработку извлеченных элементов перед вставкой) следующим образом:

  • Если количество столбцов в таблице равно количеству вставленных элементов

     for i in l_rec.first..l_rec.last loop insert into your_table values l_rec(i); end loop; 
  • Если число столбцов в таблице больше, то число вставленных значений

     for i in l_rec.first..l_rec.last loop insert into (select column1, .. ,columnn from your_table) values l_rec(i); end loop; 

мне это понравилось 🙂 короткое и сладкое.

 create or replace procedure proc1(p_ReqID varchar2,p_ItemID varchar2,p_ItemQty varchar2) is begin insert into test(req_id,item_id,itemqty) select regexp_substr(req_id,'[^;]+',1,level), regexp_substr(item_id,'[^;]+',1,level), regexp_substr(item_qty,'[^;]+',1,level) from ( select p_ReqID Req_ID,p_ItemID item_id,p_ItemQty item_qty from dual ) connect by regexp_substr(req_id,'[^;]+',1,level) is not null; end;