Во-первых, мой фон находится в SQL Server. Использование CTE (Common Table Expressions) - это бриз и преобразование его в хранимую процедуру с переменными не требует каких-либо изменений в структуре SQL, кроме замены введенных значений именами переменных.ORACLE: Использование CTE (общие выражения таблицы) с PL/SQL
В Oracle PL/SQL, однако, это совершенно другое дело. Мои CTE работают отлично, как прямой SQL, но как только я попытаюсь обернуть их как PL/SQL, я столкнулся с множеством проблем. По моему мнению, SELECT теперь нуждается в INTO, который будет удерживать результаты только одной записи. Тем не менее, я хочу, чтобы весь набор записей из нескольких значений.
Приносим извинения, если упускаю из виду очевидное здесь. Я думаю, что 99% моей проблемы - это сдвиг парадигмы, который мне нужно сделать.
Учитывая следующий пример:
Примечание: Я сильно я над упрощая SQL здесь. Я знаю, что приведенный ниже пример может быть выполнен в одном выражении SQL. Фактический SQL намного сложнее. Это основные принципы, которые я ищу здесь.
WITH A as (SELECT * FROM EMPLOYEES WHERE DEPARTMENT = 200),
B as (SELECT * FROM A WHERE EMPLOYEE_START_DATE > date '2014-02-01'),
C as (SELECT * FROM B WHERE EMPLOYEE_TYPE = 'SALARY')
SELECT 'COUNTS' as Total,
(SELECT COUNT(*) FROM A) as 'DEPT_TOTAL',
(SELECT COUNT(*) FROM B) as 'NEW_EMPLOYEES',
(SELECT COUNT(*) FROM C) as 'NEW_SALARIED'
FROM A
WHERE rowcount = 1;
Теперь, если я хочу сделать это в PL/SQL с переменными, которые передаются или предопределенные в верхней части, это не простой вопрос об объявлении переменных, появляются значения в них, и изменяя мой жесткий -кодированные значения в переменные и их запуск. ПРИМЕЧАНИЕ. Я знаю, что я могу просто изменить жестко закодированные значения на такие переменные, как: Department,: StartDate и: Type, но опять же, я упрощаю пример.
Есть три проблемы, я столкнулся здесь, что я пытаюсь обернуть вокруг головы:
1) Что было бы лучшим способом переписать это с помощью PL/SQL с объявленной переменной? CTE теперь должны что-то вникать. Но тогда я имею дело с одной строкой за раз, а не со всей таблицей. Таким образом, CTE «A» является одной строкой за раз, а CTE B будет видеть только одну строку, а не все результаты данных A и т. Д. Я знаю, что, скорее всего, мне придется использовать КУРСОРЫ для прохождения записи, которые каким-то образом, похоже, усложняют это.
2) Выход теперь должен использовать DBMS_OUTPUT. Для нескольких записей мне придется использовать КУРСОР с FETCH (или FOR ... LOOP). Да?
3) Собирается ли большая проблема с производительностью с этим прямолинейным SQL в отношении скорости и используемых ресурсов?
Спасибо заранее и снова, извиняюсь, если мне не хватает чего-то действительно очевидного здесь!
пожалуйста просматривать, например. на http://stackoverflow.com/tags/plsql/info и начать читать серии Стивена Фейерштейна PL/SQL 101 (вы найдете ссылки в теге wiki). – user272735