Получить данные, скопированные функцией - PullRequest
0 голосов
/ 19 апреля 2019

У меня довольно сложная структура данных, которая лежит в нескольких таблицах.У меня есть функция, которая делает копию этой структуры.Я хочу сделать копию и получить вновь созданные данные в одном запросе, подобном следующему:

SELECT
    *
FROM
    main_table
    JOIN other_table
    ON (main_table.id = other_table.main_id)
WHERE
    main_table.id = make_copy(old_id);

Копия успешно создана, но не возвращена вышеуказанным запросом.Я предполагаю, что это еще не видимо для внешнего запроса или как-то совершено .

Я также пытался использовать WITH ... SELECT ..., но безуспешно ...

Функция make_copy(id) объявлена ​​как VOLATILE, поскольку она изменяет базу данных, и несколько вызовов с одним и тем же параметром создадут несколько копий.

Возможное решение может состоять в том, что функция make_copy(id) вернет всю новую структуру данных(SELECT * FROM make_copy(old_id)), но для этого потребуется много псевдонимов (многие таблицы имеют столбец id или name).Также у меня было бы много мест для построения (чтения) этой структуры данных.

Как я могу вызвать эту функцию и использовать ее результат (и все побочные эффекты) в одном запросе?

1 Ответ

2 голосов
/ 19 апреля 2019

Боюсь, это невозможно без разделения на два запроса.

CTE не может вам помочь - Data-Modifying Statements in WITH (см. Пример с обновлением таблицы внутри cte):

... Подвыражения в WITH выполняются одновременно с каждым Другое и с основным запросом. Поэтому при использовании модификации данных операторы в WITH, порядок, в котором указанные обновления фактически случиться непредсказуемо. Все утверждения выполняются с одинаковым снимок (см. главу 13), поэтому они не могут «видеть» эффекты друг друга на целевых столах. Это смягчает последствия непредсказуемость фактического порядка обновления строк, а это означает, что ВОЗВРАЩЕНИЕ данных - это единственный способ сообщить об изменениях между разные под-операторы WITH и основной запрос ...

И я думаю, что вы не можете сделать это с помощью функции - Function Volatility Categories:

Для функций, написанных на SQL или в любой стандартной процедурной Языки, есть второе важное свойство, определяемое категория волатильности, а именно видимость любых изменений данных, которые были сделаны командой SQL, которая вызывает функцию. Функция VOLATILE будет видеть такие изменения, СТАБИЛЬНЫЕ или НЕМНОГО Функция не будет. ... функции VOLATILE получают свежий снимок в начало каждого запроса, который они выполняют.

...