#oracle #oracle11g #cursor #procedure
#Oracle #oracle11g #курсор #процедура
Вопрос:
Существует набор SQL-запросов, которые я хочу преобразовать в процедуру без создания и удаления промежуточных таблиц. Я включил примеры запросов ниже. какой может быть наилучший способ для этого? Поскольку я новичок в процедурах, могу посоветовать мне, как это сделать.
Можем ли мы использовать курсор в процедурах для этого? В последней строке запроса я присоединяюсь к 2 промежуточным таблицам. вместо этого мы можем объединить два курсора? Если да, то как мы можем это сделать? Есть ли какой-либо способ сделать это. Пожалуйста, предложите мне.
СОЗДАЙТЕ ТАБЛИЦУ A КАК SELECT ID_LOAN ИЗ master_copy, ГДЕ ZERO_BAL_CODE В (1);
СОЗДАЙТЕ ТАБЛИЦУ B Как ВЫБЕРИТЕ master_copy.ID_LOAN, LOAN_AGE,master_copy.vintage, DELINQ_STATUS, ZERO_BAL_CODE, master_copy.ACTUAL_LOSS,current_upb ИЗ master_copy ВНУТРЕННЕГО СОЕДИНЕНИЯ A В master_copy.ID_LOAN= A.ID_LOAN;
СОЗДАЙТЕ ТАБЛИЦУ prepaidData КАК SELECT ID_LOAN, max(to_number(DELINQ_STATUS)) как DELINQ_STATUS, max(loan_age) КАК LOAN_AGE, max(ZERO_BAL_CODE) как ZERO_BAL_CODE, max (vintage) как vintage, min (ACTUAL_LOSS) как actual_loss, MIN(NULLIF(current_upb, 0)) как current_upb ИЗ группы B по id_loan; изменить таблицу prepaiddata добавить loan_type varchar2(255) по умолчанию ‘предоплаченный’;
удалите таблицу a; удалите таблицу b;
СОЗДАЙТЕ ТАБЛИЦУ A КАК SELECT ID_LOAN ИЗ master_copy, ГДЕ ZERO_BAL_CODE В (3);
СОЗДАЙТЕ ТАБЛИЦУ B Как ВЫБЕРИТЕ master_copy.ID_LOAN, LOAN_AGE,master_copy.vintage, DELINQ_STATUS, ZERO_BAL_CODE, master_copy.ACTUAL_LOSS,current_upb ИЗ master_copy ВНУТРЕННЕГО СОЕДИНЕНИЯ A В master_copy.ID_LOAN= A.ID_LOAN;
СОЗДАЙТЕ ТАБЛИЦУ DEFAULT_FORECLOSURE КАК SELECT ID_LOAN, max(to_number(DELINQ_STATUS)) как DELINQ_STATUS, max(loan_age) КАК LOAN_AGE, max(ZERO_BAL_CODE) как ZERO_BAL_CODE, max (vintage) как vintage, min (ACTUAL_LOSS) как actual_loss, MIN(NULLIF(current_upb,0)) как current_upb ИЗ группы B по id_loan; изменить таблицу DEFAULT_FORECLOSURE, добавить loan_type varchar2(255) по умолчанию ‘default_foreclosure’;
удалите таблицу a; удалите таблицу b;
создайте таблицу aa_loan_type как (выберите * из объединения prepaiddata выберите * из DEFAULT_FORECLOSURE);
Ответ №1:
Лучший способ избежать промежуточных таблиц — использовать встроенные представления. Ваши запросы могут быть переписаны в этот оператор SQL:
--aa_loan_type
--
--prepaidData
SELECT ID_LOAN,max(to_number(DELINQ_STATUS)) as DELINQ_STATUS,max(loan_age) AS LOAN_AGE,max(ZERO_BAL_CODE) as ZERO_BAL_CODE,max(vintage) as vintage, min(ACTUAL_LOSS) as actual_loss,MIN(NULLIF(current_upb,0)) as current_upb, 'PREPAID' LOAN_TYPE
FROM
(
--B
SELECT
master_copy.ID_LOAN,LOAN_AGE,master_copy.vintage,DELINQ_STATUS,ZERO_BAL_CODE,master_copy.ACTUAL_LOSS,current_upb
FROM master_copy
INNER JOIN
(
--A
SELECT ID_LOAN FROM master_copy WHERE ZERO_BAL_CODE IN (1)
) A
ON master_copy.ID_LOAN= A.ID_LOAN;
) B
GROUP BY ID_LOAN
union
--DEFAULT_FORECLOSURE
SELECT ID_LOAN,max(to_number(DELINQ_STATUS)) as DELINQ_STATUS,max(loan_age) AS LOAN_AGE,max(ZERO_BAL_CODE) as ZERO_BAL_CODE,max(vintage) as vintage, min(ACTUAL_LOSS) as actual_loss,MIN(NULLIF(current_upb,0)) as current_upb, 'default_foreclosure' loan_type
FROM
(
--B
SELECT master_copy.ID_LOAN,LOAN_AGE,master_copy.vintage,DELINQ_STATUS,ZERO_BAL_CODE,master_copy.ACTUAL_LOSS,current_upb
FROM master_copy
INNER JOIN
(
--A
SELECT ID_LOAN FROM master_copy WHERE ZERO_BAL_CODE IN (3)
) A
ON master_copy.ID_LOAN= A.ID_LOAN
) B
group by id_loan;
При правильном построении один большой оператор SQL часто намного лучше, чем несколько небольших операторов SQL. Общий код будет проще (меньше объектов, легче отлаживать в IDE) и потенциально намного быстрее (нет необходимости записывать данные, дает оптимизатору больше шансов сделать что-то умное).
Построение большого SQL «правильно» субъективно, но это сводится к обработке каждого встроенного представления как миниатюрной программы:
- Упростите каждое встроенное представление, объедините их в простые шаги и повторите.
- Используйте правильные имена и комментарии для каждого встроенного представления. Вероятно, вам захочется чего-то лучшего, чем «A» и «B».
- Используйте соответствие скобок в стиле Allman с круглыми скобками в каждой строке. Встроенные представления важны и заслуживают дополнительных пробелов и выровненных круглых скобок. За исключением начинающих разработчиков, нам не нужно выравнивать ключевые слова, такие как
SELECT
иFROM
. Нам нужно выровнять важные границы, такие как круглые скобки каждого встроенного представления. Это поможет вам отлаживать, быстро выделяя и запуская код в IDE. - Упростите интерфейсы подзапросов, используя встроенные представления вместо коррелированных подзапросов или общих табличных выражений. Прелесть встроенных представлений заключается в их простоте — ввод реляционных данных, вывод реляционных данных.