При рефакторинге некоторых сложных пакетов PL / SQL для повышения производительности несколько раз у меня возникала следующая ситуация:
Ввод: два PL / SQL VARRAYs A и B или TABLE одинаковой длины (для Например, SYS.ODCIVarchar2List), например,
A := SYS.ODCIVarchar2List('Summer', 'Winter');
B := SYS.ODCIVarchar2List('hot', 'cold');
(записи в списках по заданному индексу соответствуют друг другу).
Теперь у меня более или менее сложный SQL оператор (например, MERGE INTO), где мне нужен гипотетический «zip (A, B)» в качестве ввода.
Единственное решение, которое я нашел до сих пор, - это конструкция, подобная этой:
with t1 as (select rownum rn, column_value as season from table(:A))
, t2 as (select rownum rn, column_value as temperature from table(:B))
, input as (select t1.season, t2.temperature
from t1, t2
where t1.rn = t2.rn
)
-- Now do something with the input. For demonstration purpose, just show it:
select * from input;
Это работает, но кажется слишком сложным для такой простой задачи.
Есть ли лучшее решение?
Примечание: я знаю о теоретической неопределенности относительно порядок «выбрать из таблицы (...)». Это всегда работало, поэтому давайте не будем обсуждать это здесь, пока однажды кто-то не сможет показать пример, где это не так.
В качестве примечания (и для дальнейшего уточнения вопроса): В Python я может сделать это:
L=[1,2]
M=["A","B"]
list(zip(L,M))
, и это возвращает список такой же длины, как L и M с объединенными записями:
[(1, 'A'), (2, 'B')]
Что мне нужно, это что-то вроде этого в SQL.