Как я могу объединить строку с массивами внутри этой строки в запросе Oracle SQL - PullRequest
0 голосов
/ 22 января 2019

У меня есть несколько пользовательских типов оракула, объявленных так:

create type S_TYPE as table of VARCHAR2(4000);

CREATE TYPE "OBJ_ORDER_ADD" AS object (
  ADD_TYPE NUMBER,
  ADDITION s_type
  -- other fields not represented here for brevity
);

create type ARRAY_ORDER_ADD as table of OBJ_ORDER_ADD;

Это означает, что я могу создавать экземпляры ARRAY_ORDER_ADD, которые выглядят так:

add_type  | addition
---------------------
      10  | ['a', 'b']
      20  | ['x', 'y', 'z']

Iнеобходимо создать FUNCTION, который может объединить данные, содержащиеся в соответствующей таблице order_add, где столбец addition равен VARCHAR.После объединения вышеприведенного объекта в пустую таблицу я хочу, чтобы таблица содержала:

add_type | addition
-------------------
      10 | 'a'
      10 | 'b'
      20 | 'x'
      20 | 'y'
      20 | 'z'

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

Моя идеальная цель - сделать это с помощью одного MERGE запроса.

Возможно ли это?

Я пробовал несколько комбинаций SELECT ... FROM TABLE(myRecord) и пыталсякаким-то образом сделать декартово произведение каждой записи с TABLE(myRecord.addition), но я просто не могу собрать его правильно.

1 Ответ

0 голосов
/ 22 января 2019

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

Предложение WITH создает коллекцию ваших примеров данных, затем мы используем последовательные функции table() для распаковки вложенных табличных объектов:

with cte as (
    select ARRAY_ORDER_ADD(OBJ_ORDER_ADD(10, s_type('a', 'b')) 
                          , OBJ_ORDER_ADD(20, s_type('a', 'b', 'c'))) as nt 
    from dual
    )
select t.add_type
      , x.column_value as s_type_element
 from cte
       , table(cte.nt)  t
       , table(t.addition) x; 
...