Как “соединить” 2 функции в Oracle SQL, где результат одной функции является параметром для другой

Вопрос или проблема

У меня есть следующая функция:

select POD
from get_error_rate_by_pod(:P26_REPORT_WEEK,:P26_ERROR_TYPE);

И мне нужно передать каждый результат из вышеуказанного запроса в следующую функцию в качестве второго параметра:

select * 
from p49_get_data(:P26_REPORT_WEEK,POD,:P26_ERROR_TYPE);

И в основном “объединить” эти результаты вместе

Могу ли я сделать это с помощью запроса? Или мне нужно создать функцию с циклом + аккумулятором?

Я могу изменить вторую функцию, если это необходимо, чтобы она принимала серию PODS или регулярное выражение (что я бы не хотел), но надеюсь, что это не потребуется.

Ответ или решение

Вы можете объединить результаты двух функций в Oracle SQL, используя подзапросы и оператор UNION. В данном случае вам нужно выполнить первый запрос, чтобы получить все значения POD, а затем передать каждое значение POD во второй запрос.

В данном решении мы будем использовать оператор CROSS JOIN, чтобы проиллюстрировать, как можно "соединить" результаты первой функции с параметрами второй функции. Первый шаг – получить результаты из get_error_rate_by_pod, а затем для каждого результата выполнить вызов второй функции p49_get_data.

Пример SQL-запроса может выглядеть следующим образом:

SELECT *
FROM (
    SELECT *
    FROM p49_get_data(:P26_REPORT_WEEK, POD, :P26_ERROR_TYPE)
    FROM get_error_rate_by_pod(:P26_REPORT_WEEK, :P26_ERROR_TYPE) 
) 

Однако, так как функция get_error_rate_by_pod возвращает набор записей (состоящий из одной колонки POD), и мы хотим сделать выборку для каждого из этих значений, вам потребуется использовать конструкцию JOIN, чтобы связать эти две функции. Мы можем использовать аналог OUTER JOIN, если необходимо. Вот пример более подробного запроса:

SELECT d.*
FROM get_error_rate_by_pod(:P26_REPORT_WEEK, :P26_ERROR_TYPE) r
JOIN LATERAL (
    SELECT *
    FROM p49_get_data(:P26_REPORT_WEEK, r.POD, :P26_ERROR_TYPE)
) d ON 1=1

Обратите внимание на использование LATERAL, который позволяет сослаться на результат предыдущего запроса (в данном случае, значение POD из первой функции) в подзапросе. Это решение очень эффективно для выполнения такой задачи и не затрагивает необходимость создания дополнительных функций или циклов.

Если ваша система Oracle не поддерживает LATERAL, вы можете использовать обычные подзапросы:

SELECT *
FROM p49_get_data(:P26_REPORT_WEEK, POD, :P26_ERROR_TYPE)
WHERE POD IN (
    SELECT POD
    FROM get_error_rate_by_pod(:P26_REPORT_WEEK, :P26_ERROR_TYPE)
)

Этот пример подразумевает, что вы хотите получить все результаты из функции p49_get_data, где POD содержится в результате функции get_error_rate_by_pod. Этот подход хорошо работает, если количество данных не слишком велико.

Используя эти примеры, вы сможете эффективно "соединить" результаты двух функций в один запрос.

Оцените материал
Добавить комментарий

Капча загружается...