Комментарии 8
Атрибут %ROWTYPE автоматически наследует структуру всех столбцов таблицы или курсора (не будет рассматриваться в этой статье), обеспечивая удобство работы с несколькими значениями одновременно.
А как ведёт себя объявленная таким способом переменная, если структура таблицы, из которой наследуется структура переменной, изменяется в блоке кода?
Текст ниже, а именно
Таблица будет часто обновляться новыми столбцами – %ROWTYPE их включит, а использоваться они, вероятно, не будут.
как бы намекает, что при добавлении поля структура расширяется, а при удалении - не сжимается. Если это так - как поведёт себя конструкция при: создании поля, его удалении, и затем создании с другим типом данных? особенно - что произойдёт с данными в переменной, уже инициализированной значением.
Когда возникает ошибка, выполнение основного блока прерывается, и управление передаётся в блок EXCEPTION.
А куда происходит переход точки выполнения по завершении кода этого блока? Возврат в точку возникновения? в точку после точки возникновения? в указанную точку? или выполнение процедуры прерывается окончательно и безусловно?
И ещё - что происходит, если ошибка возникает при выполнении кода блока EXCEPTION?
Подстановочные переменные (или bind-переменные) инициализируются в блоке PL/SQL, но могут быть созданы вне его. Они могут быть использованы для передачи значений в SQL-запросы.
Вот вообще ничего не понять.
От "Присвоения влоб" код отличается только наличием дополнительного двоеточия перед именем переменной. А где собственно демонстрация разницы-то? Что может переменная после такого присвоения, чего она не могла раньше? и наоборот - какие возможности она утратила?
И может ли переменная по мере исполнения кода выступать то в первой, то во второй ипостаси?
Пример использования замещающей переменной:
Что-то ерунда какая-то, право слово. Раньше по тексту явно было сказано, что переменные определяются в DECLARE. И вдруг мы видим объявление переменной с использованием DEFINE прямо в блоке кода. Это вообще как?
Сравнение типов переменных
Опять непонятно, откуда что взялось. Что за типы PL/SQL и VAR - про них не было сказано ни полслова. Куда делось DECLARE?
Хорошая табличка со сравнением видов переменных здесь
Вот чего в ней хорошего? опять - акцент на неописанные выше ACCEPT и VARIABLE. И никаких пояснений...
а подробное описание тут.
А за такие вещи как предложение пойти на другой сайт за частью материала, и вовсе бить надо. Вы зачем статью пишете?
Или что, это такой способ создать рекламу и обеспечить странице клики, что ли? Так Ораклу оно не надо, он нас и так не любит...
а при удалении - не сжимается
Такое не написано. В том и дело, что структура повторяется и ошибка выпадет в том случае, если вызываемый из ROWTYPE атрибут будет удален.
А куда происходит переход точки выполнения по завершении кода этого блока? Возврат в точку возникновения? в точку после точки возникновения? в указанную точку? или выполнение процедуры прерывается окончательно и безусловно?
И ещё - что происходит, если ошибка возникает при выполнении кода блока EXCEPTION?
А это интересно, спасибо, буду разбираться)
А где собственно демонстрация разницы-то?
Про часть вы и сами написали -- в статье указано, что может создаваться вне блока;
Текст ниже: "Присваивать значение переменной не обязательно – Oracle, если не найдет что подставить вместо :var_name, выведет окошко с предложением ввести подстановочный текст. ", чего не происходит с обычной переменной.
Раньше по тексту явно было сказано, что переменные определяются в DECLARE
Это касалось базового типа переменных, а здесь описание именно замещающей. Нужно было явно прописать, спасибо!
Опять непонятно, откуда что взялось. Что за типы PL/SQL и VAR - про них не было сказано ни полслова. Куда делось DECLARE?
Спасибо, исправил, и правда некорректно.
Вот чего в ней хорошего? опять - акцент на неописанные выше ACCEPT и VARIABLE. И никаких пояснений...
Я исходил из того, что нет смысла пытаться уместить абсолютно все в одну статью. На хабре лежит подробнейшая статья отдельно про триггеры с кучей примеров -- если разбирать каждый элемент этой статьи в такой формате, то выйдет очень длинное чтиво, которое окажется уже и не совсем введением.
А за такие вещи как предложение пойти на другой сайт за частью материала, и вовсе бить надо. Вы зачем статью пишете?
Предыдущие комментарии по делу, а тут..
Очевидно, что таблица не моя - > указываю ее источник. Ссылка на документацию - в целом первоисточник всего, аргументация того, почему ее не пересказываю в статье, аналогична предыдущему блоку.
В любом случае, спасибо за подробный разбор! Приметил несколько моментов, где понимаю, что нет ответа. Да что там, даже не задался такими вопросами)
Я исходил из того, что нет смысла пытаться уместить абсолютно все в одну статью.
Вы, и именно вы, приняли решение назвать статью "Введение ...". Это название однозначно предполагает, что вы обращаетесь к читателю, который в данной области знаний не знает вообще ничего. И вы сейчас за ручку введёте его в совершенно новую область знания. Ну то есть отдельно взятый читатель, конечно, может и знать, и даже может быть экспертом больше автора - не возбраняется,- но и читатель, реально ничего не знающий, не должен попасть в ситуацию, когда у него нет шансов понять без использования стороннего ресурса. Следовательно, вы должны объяснять и разъяснять абсолютно всё. Никаких умолчаний и надежд, что читатель знает или разберётся.
В нынешнем состоянии статья весьма далека от идеала и не соответствует своему названию.
Повторюсь, введение не значит объяснение всего. Скорее это первичные знания, которые позволят чуть-чуть ориентироваться в теме, чтобы понимать, что дальше читать, стоит ли дальше читать и такого плана задачи.
Вдобавок, ссылки оставлялись в том числе с надеждой на то, что станет интересно почитать иные ресурсы, особенно зарубежные.
В нынешнем состоянии статья весьма далека от идеала и не соответствует своему названию.
Если это касается не только вопросов, которые были подняты вами в предыдущем комментарии, можете чуть расширить тезис? Казалось, что достаточно доступно изложено
Это полезно, если изменится тип данных столбца в таблице
Да не в этом дело. У вас часто меняются типы данных в таблицах? Это нужно только для того, чтобы не смотреть DDL и не думать о том, какой тип данных у поля, и какой тип данных pl/sql использовать для переменной.
В блоке BEGIN размещается основной код, который будет выполняться. Это может быть один или несколько SQL-запросов
Почему только SQL-запросы? А логика, циклы, вызов других функций итд?
Обработчик WHEN OTHERS перехватывает все ошибки, не указанные явно
Как-то криво сформулировали. Он перехватывает не ошибки, а исключения. И не "не указанные явно", а которые не были обработаны
Подстановочные переменные (или bind-переменные) инициализируются в блоке PL/SQL, но могут быть созданы вне его.
Чего?
Они могут быть использованы для передачи значений в SQL-запросы.
Только в SQL-запросы?
Присваивать значение переменной не обязательно – Oracle, если не найдет что подставить вместо :var_name, выведет окошко с предложением ввести подстановочный текст.
И что, если я повешу процедуру на триггер, то сервак мне напишет в телеграмм и попросит ввести значение?
Статья родилась из моих заметок, которые составлял в процессе самостоятельного изучения темы, а именно из первого блока, аля “новичкового”.
Пока это плохой материал, которым новичкам лучше игнорировать. А вам стоит подучить матчасть. И вам пока рано в курсоры и триггеры, разберитесь с основами.
У вас часто меняются типы данных в таблицах
Бывало. Сперва при изменении PK, затем из-за нежданчиков с кодировкой систем-источника. А про NUMBER - изменились хотелки в части округления. То есть событие нечастое, да, но все же имеет место. Добавил указание на то, что чаще пригождается то, что вы описали.
Почему только SQL-запросы? А логика, циклы, вызов других функций итд?
А здесь руководствовался тем, что, если их упомянуть, то придется хотя бы мельком обозреть, что увеличит объем статьи. Изначально хотел поместить это в следующей, некоторое углубление. Думаете, лучше сразу это указывать? Возможно, из-за нехватки опыта в написании статей рассуждаю однобоко.
Как-то криво сформулировали. Он перехватывает не ошибки, а исключения. И не "не указанные явно", а которые не были обработаны
Вы правы, так проще и прямолинейнее.
Чего?
Дополнил. Имел в виду, что присвоение значения не через ввод с клавиатуры во всплывающее окно происходит внутри блока PL/SQL, а вот создать можно где угодно.
И что, если я повешу процедуру на триггер, то сервак мне напишет в телеграмм и попросит ввести значение?
Вот именно поэтому так делать не стоит:)
Пока это плохой материал, которым новичкам лучше игнорировать. А вам стоит подучить матчасть. И вам пока рано в курсоры и триггеры, разберитесь с основами.
Возможно, это следовало из ваших комментариев, но пока не понял, почему же. Прошу пояснить, если будет возможность.
Спасибо за замечания!
Возможно, это следовало из ваших комментариев, но пока не понял, почему же. Прошу пояснить, если будет возможность.
В принципе, выше вам уже дали ответ на это вопрос, но ок, отвечу и я. Я не против формата "учусь/конспектирую/публикую то, как понял я", но ваш материал отмечен как "Туториал". Беря в руки туториал, я надеюсь получить корректную и достаточную информацию на заданную тему. Чтобы написать туториал, нужно не просто прочитать пару документов, нужно основательно разобраться в материала, и очень желательно поработать с предметом в промышленной среде. Сейчас я вижу, что вы пока ещё сами пытаетесь разобраться, поэтому писать туториалы на тему pl/sql вам несколько преждевременно.
Отдельно отмечу, что я не оцениваю ваш уровень, все мы чему-то учимся, делаем ошибки, заблуждаемся, встречаем озарения, находим важно в том что ранее касалось незначительным. Обучение чему-либо - это классно. Но для написания статьи сначала нужно разобраться самому. Если не забросите, если будете капать, то через какое-то время сами посмотрите на свою статью и дадите ей очень скептическую оценку. Но до этого нужно дожить, а по пути очень многое понять и освоить.
Могу посоветовать поискать в сети два курса:
Oracle Database 12c R2 PL_SQL Fundamentals
Oracle Database 12c R2 Advanced PL_SQL
В них вы найдёте ответы на все заданные и не заданные вопросы, и если хотите закрепиться в этой теме, рекомендую пройти их полностью.
Введение в PL/SQL