Я спулирую из сценария SQL * Plus множество SELECT для разделения CSV, большинство из которых ПРИСОЕДИНЯЮТСЯ к одному и тому же SELECT, который я поместил как WITH перед SELECT в каждом SPOOL, чтобы хотя бы иметь возможность легко найти и заменить.
Теперь я пытаюсь избавить скрипт от повторения кода и оптимизировать производительность, возможно, сохраняя результаты повторного SELECT и повторно используя их в каждом SPOOL.
Я пытался использовать переменные для хранения результатов SELECT, который повторяется как WITH, но я не могу смешать SPOOL SQL * Plus с кодом PL / SQL (используя SPOOL внутри DECLARE BEGIN / END блок завершается неудачно, в командной строке выводится только число 28 Сначала я подумал, что нужны временные таблицы, но есть только доступ только для чтения, поэтому нет DDL, как CREATE / ALTER и т. Д.
SET MARKUP CSV ON
-- omitting delimiter and other SQL*Plus options set
SPOOL C:\test\1.csv
WITH Y AS ( SELECT * FROM Z )
SELECT * FROM X JOIN Y ON Y.W = X.W
;
SPOOL OFF
SPOOL C:\test\2.csv
WITH Y AS ( SELECT * FROM Z )
SELECT * FROM W JOIN Y ON Y.X = W.X
;
SPOOL OFF
-- many other different spools joining on the same WITH SELECT
exit;
Этот код работает нормально, но я бы предпочел не повторять один и тот же WITH, так как это снижает производительность и делает код рутинной задачей для поддержки / работы. Тем не менее, главная проблема здесь - это повторение кода, а не обязательно снижение производительности, по крайней мере, на данный момент, хотя уродливо, когда сервер повторяет одни и те же запросы снова и снова.
Очевидно, я не грамотен в Oracle / PL / SQL.