Ревью функции с курсором
Постановка: смотрите пост вторника.
Анализ
Кратко: я бы такой код не пропустил на ревью.
см код выше
1️⃣ Стр 2. Возвращается тип без привязки к колонки таблицы. Нет причин не использовать жесткую привязку к колонке text.
2️⃣ Стр 4. Избыточное объявление курсора. Можно использовать системный тип sys_refcursor.
3️⃣ Стр 13 и 16. Закрывать курсор надо 100%. В штатном режиме он закроется. А вот в случае возникновения исключения - нет закрытия. Ошибка неопытного курсоро-пользователя. Добавляется блок exception с проверкой на открытость курсора и его закрытием if v_curs%is_open then close v_curs; end if;
4️⃣ Но это частности. Основной вопрос к коду: зачем использовать явный курсор? Ответ: не имеет никакого смысла. Код можно переписать, например, так:
Есть ли значение по переданному id или нет. Поведение осталось прежним.
▫️Должна ли вызывающая среда знать, о том что строка не найдена? Не имея, каких-либо доп вводных ответить на этот вопрос сложно.
▫️Можно ли использовать result_cache? Определенно сказать сложно. Если таблица t1 постоянно меняется (это не справочник), то нет. Если меняется редко - можно попробовать. Опять же при условии, что тип колонки text проходит по ограничениям result cache.
▫️Если функция используется в SQL, то стоит подумать насчет pragma udf, deterministic (осторожно).
Мало чего ясно, но очень хочется понимать?
Есть возможность с 9-го сентября ворваться в магию PL/SQL 🎩
Напишите мне, если хотите забронировать место на новый поток. Оплатить можно непосредственно перед стартом.
Палец вверх, если задача понравилась. А еще можно перетереть в чатике.
#решениезадачи #cursor
@oracle_dbd
Постановка: смотрите пост вторника.
Анализ
Кратко: я бы такой код не пропустил на ревью.
см код выше
1️⃣ Стр 2. Возвращается тип без привязки к колонки таблицы. Нет причин не использовать жесткую привязку к колонке text.
2️⃣ Стр 4. Избыточное объявление курсора. Можно использовать системный тип sys_refcursor.
3️⃣ Стр 13 и 16. Закрывать курсор надо 100%. В штатном режиме он закроется. А вот в случае возникновения исключения - нет закрытия. Ошибка неопытного курсоро-пользователя. Добавляется блок exception с проверкой на открытость курсора и его закрытием if v_curs%is_open then close v_curs; end if;
4️⃣ Но это частности. Основной вопрос к коду: зачем использовать явный курсор? Ответ: не имеет никакого смысла. Код можно переписать, например, так:
function get_text_new(p_id t1.id%type)▫️В данном варианте, не важно id уникально или нет (как в первом так и во втором будет рендомно отдавать какую-то строку).
return t1.text%type
is
v_text t1.text%type;
begin
select max(t1.text)
into v_text
from t1 where t1.id = p_id;
return v_text;
end;
/
Есть ли значение по переданному id или нет. Поведение осталось прежним.
▫️Должна ли вызывающая среда знать, о том что строка не найдена? Не имея, каких-либо доп вводных ответить на этот вопрос сложно.
▫️Можно ли использовать result_cache? Определенно сказать сложно. Если таблица t1 постоянно меняется (это не справочник), то нет. Если меняется редко - можно попробовать. Опять же при условии, что тип колонки text проходит по ограничениям result cache.
▫️Если функция используется в SQL, то стоит подумать насчет pragma udf, deterministic (осторожно).
Мало чего ясно, но очень хочется понимать?
Есть возможность с 9-го сентября ворваться в магию PL/SQL 🎩
Напишите мне, если хотите забронировать место на новый поток. Оплатить можно непосредственно перед стартом.
Палец вверх, если задача понравилась. А еще можно перетереть в чатике.
#решениезадачи #cursor
@oracle_dbd
Ревью функции с динамическим SQL. Решение
Постановка: смотрите пост вторника.
Анализ
Кратко: я бы такой код не пропустил на ревью.
Такое ощущение, что это писал человек, который вчера узнал про коллекции и динамический SQL и начал применять это везде.
Начнем с требуемого функционала: нужно вывести определенные поля из таблицы employees отсортированной по полю salary.
Весь код можно упростить до:
Вполне, подойдет проход в цикле по неявному курсору.
Пример упрощенный, поэтому вместо “чего-то деланья”, выводится текст. Как правильно заметили участники чатика, было бы неплохо отделить мух от котлет. Вывод данных от получения данных. Но это уже совсем тонкая материя, не для этого уровня задачи.
Хотите научиться писать PL/SQL-код, за который не будет стыдно?
Уже сегодня в 20:00 запускается очередной поток курса “Основы PL/SQL”. Не упустите свой шанс 😉
Палец вверх, если задача понравилась 👍
Обсудить в чатике 🗣
#решениезадачи #dynamicsql #cursor
@oracle_dbd
Постановка: смотрите пост вторника.
Анализ
Кратко: я бы такой код не пропустил на ревью.
Такое ощущение, что это писал человек, который вчера узнал про коллекции и динамический SQL и начал применять это везде.
Начнем с требуемого функционала: нужно вывести определенные поля из таблицы employees отсортированной по полю salary.
Весь код можно упростить до:
beginОпределение локальных типов, коллекции, динамический SQL - все это не нужно и избыточно. Даже, не нужен столбец salary - он не выводится.
for r in (select first_name || last_name name
from employees
order by salary desc) loop
dbms_output.put_line(r.name);
end loop;
end;
/
Вполне, подойдет проход в цикле по неявному курсору.
Пример упрощенный, поэтому вместо “чего-то деланья”, выводится текст. Как правильно заметили участники чатика, было бы неплохо отделить мух от котлет. Вывод данных от получения данных. Но это уже совсем тонкая материя, не для этого уровня задачи.
Хотите научиться писать PL/SQL-код, за который не будет стыдно?
Уже сегодня в 20:00 запускается очередной поток курса “Основы PL/SQL”. Не упустите свой шанс 😉
Палец вверх, если задача понравилась 👍
Обсудить в чатике 🗣
#решениезадачи #dynamicsql #cursor
@oracle_dbd
Решение. Ревью. Замена домена в email
Всем привет!
Постановка: в посте вторника.
Анализ
Сразу скажу, у меня такой код не прошел бы ревью. Объясню причины.
1️⃣ Работа с данными выполняется по одной строке, используя курсор.
2️⃣ Работая с пачками, для обновления таблицы broker, стоит использовать forall - оператор множественного связывания.
3️⃣ Код не закрывает корректно курсор, в случае возникновения исключений.
Обычно это выполняется через блок обработки ошибок в конце процедуры.
Главный вопрос - а зачем нам тут курсор и построчная обработка❓
С учетом объема строк (100К), одного обычного update вполне хватит, чтобы решить эту задачу. Обертка в виде процедуры - дело конкретной реализации.
Код получился очень простой и лаконичный.
В задаче не рассмотрен вопрос оптимизации выполнения запроса.
Простое правило: если вы пишете слово cursor в вашем коде, подумайте хорошенько “надо ли”, может можно сделать все проще 🤷♂️
Хотите научиться писать PL/SQL-код, за который не будет стыдно? Знать когда применять курсоры, а когда нет?
Новый набор на 8-й поток курса “Основы PL/SQL” уже начался. Старт занятий - 13 января 🎓
Палец вверх, если задача понравилась 👍 Обсудить в чатике.
#решениезадачи #cursor
Oracle Developer
Всем привет!
Постановка: в посте вторника.
Анализ
Сразу скажу, у меня такой код не прошел бы ревью. Объясню причины.
1️⃣ Работа с данными выполняется по одной строке, используя курсор.
fetch c_emailaddress into v_brokernumber, v_emailaddress;ничего не мешает вычитывать данные пачками, с использованием конструкции limit.
2️⃣ Работая с пачками, для обновления таблицы broker, стоит использовать forall - оператор множественного связывания.
3️⃣ Код не закрывает корректно курсор, в случае возникновения исключений.
Обычно это выполняется через блок обработки ошибок в конце процедуры.
exceptionНо это всё так… мелочи.
when others then
if c_emailaddress%isopen then
close c_emailaddress;
end if;
raise;
end;
Главный вопрос - а зачем нам тут курсор и построчная обработка❓
С учетом объема строк (100К), одного обычного update вполне хватит, чтобы решить эту задачу. Обертка в виде процедуры - дело конкретной реализации.
create or replace procedure change_domain(p_olddomainname varchar2/
,p_newdomainname varchar2) is
update broker
set email_address = ...
where lower(email_address) like '%@' || lower(p_olddomainname);
end;
Код получился очень простой и лаконичный.
В задаче не рассмотрен вопрос оптимизации выполнения запроса.
Простое правило: если вы пишете слово cursor в вашем коде, подумайте хорошенько “надо ли”, может можно сделать все проще 🤷♂️
Хотите научиться писать PL/SQL-код, за который не будет стыдно? Знать когда применять курсоры, а когда нет?
Новый набор на 8-й поток курса “Основы PL/SQL” уже начался. Старт занятий - 13 января 🎓
Палец вверх, если задача понравилась 👍 Обсудить в чатике.
#решениезадачи #cursor
Oracle Developer