|
|
|
а че, так можно было ?
|
|||
|---|---|---|---|
|
#18+
user1241, какая битва? Твое представление правильное до тех пор, пока ты веришь в него. Что до последнего - тема не звучала - когда лично вы, читатели форума, так делаете. Вопрос - можно ли так делать вообще. Так вот - персонально для вас - user1241 - нельзя . По вашему праву иметь собственное мнение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2017, 16:37 |
|
||
|
а че, так можно было ?
|
|||
|---|---|---|---|
|
#18+
boobyuser1241... Ты все передернул. Ссылаться можно, конечно, в документации об этом прямо написано для обоих случаев. Про менять значение для Cursor FOR LOOP Statements ничего не написано, для FOR LOOP Statement явно написано, что нельзя, но опять же семантически и логически там разные разделы, даже в цитате type INTEGER должен о чем-то говорить. касательно INTEGER - всего лишь о многолетней ошибке в документации. Просто попробуй выполнить: Код: plsql 1. 2. 3. 4. 5. 6. 7. Видел, это мимо темы, сильно в сторону обсуждение пойдёт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2017, 16:38 |
|
||
|
а че, так можно было ?
|
|||
|---|---|---|---|
|
#18+
user1241 Видел, это мимо темы, сильно в сторону обсуждение пойдёт. во, видишь как хорошо поговорили: я не читатель и все передернул, а ты, привыкший к документации, приплетаешь Integer, который о чем-то должен говорить, но, как оказалось, говорит мимо темы. А говоришь битва. Всего лишь речь идет о том, что то, что ты считаешь честью запретить лично для себя, у тебя нет сил запретить мне. Вот такой он - цветочек аленький. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2017, 16:45 |
|
||
|
а че, так можно было ?
|
|||
|---|---|---|---|
|
#18+
boobyРазница, вероятно, здесь вот в чем: в первом случае (For Loop) воздействовать на i (прямой аналог понятия итератора) означает прямую попытку слома итеративного цикла, что приводит к ошибке времени компиляции. Второй случай (cursor for loop) сам цикл следует читать как for each в "других языках программирования". То есть, во втором случае, переменная цикла не является итератором, который скрыт, и потому сам итератор нельзя сломать, а видимая переменная цикла есть просто значение, возвращаемое из коллекции скрытым от глаз писателя итератором. И делай ты с этим значением что хошь. Любая попытка объявить его immutable внутри цикла противоречила бы здравому смыслу. Т.к. а) это локальная копия значения из итерируемой коллекции и, б) никакие манипуляции с ней не способны сломать сам цикл (его скрытый итератор или условия продолжения, что в данном случае, можно не различать) В доке для cursor for loop это, по счастью не оговаривается, и любая попытка оговорить - опечалит (обессмыслит) полезность данного нам в таком виде for each С учетом, что примеров нет, с первой частью согласен, с последним предложением нет. В первом случае есть смысл менять индекс, чтобы повлиять на ход цикла, во втором случае смысла менять loop index нет, по указанным в цитате же причинам (да и мало кто додумается), поэтому в документации про это ничего не написано, т.к. смысла нет. Если есть два объяснения, логично взять самое простое. Над сильно экзотическими ситуациями, можно наверное подумать, но если они почти не встречаются, не в счет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2017, 16:48 |
|
||
|
а че, так можно было ?
|
|||
|---|---|---|---|
|
#18+
user1241, если пост был для меня - то я пас. Этот поток слов уже даже на поток сознания перестал быть похожим. Разговаривать с ботами у меня в моменте интереса нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2017, 16:58 |
|
||
|
а че, так можно было ?
|
|||
|---|---|---|---|
|
#18+
user1241С учетом, что примеров нет Попробуйте объяснить разницу между Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. и Код: plsql 1. 2. 3. 4. 5. 6. 7. Что до практических примеров - то в некоторых случаях обогащение в ETL вполне можно рассматривать как таковой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2017, 16:59 |
|
||
|
а че, так можно было ?
|
|||
|---|---|---|---|
|
#18+
andrey_anonymous, в контексте этой темы, разница: в первом случае Basic LOOP Statement, во втором случае FOR LOOP Statement. в первом случае явно объявленная переменная i, во втором случае неявно объявленный loop index i ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2017, 17:03 |
|
||
|
а че, так можно было ?
|
|||
|---|---|---|---|
|
#18+
user1241andrey_anonymous, в контексте этой темы, разница: в первом случае Basic LOOP Statement, во втором случае FOR LOOP Statement.cursor FOR LOOP Statement в первом случае явно объявленная переменная i, во втором случае неявно объявленный loop index i ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2017, 17:06 |
|
||
|
а че, так можно было ?
|
|||
|---|---|---|---|
|
#18+
user1241, в примерах andrey_anonymous во втором случае i - не индекс цикла . i - элемент коллекции, состав которой определяется курсором, возвращаемый программисту на данном логическом шаге цикла. Это не про индекс цикла ни в каком приближении. Идекс цикла во втором случае, даже если есть физически по реализации, - логически недоступен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2017, 17:10 |
|
||
|
а че, так можно было ?
|
|||
|---|---|---|---|
|
#18+
user1241в первом случае явно объявленная переменная i, во втором случае неявно объявленный loop index i В первом случае - явно объявленная i c%rowtype, во втором случае - неявно объявленная i c%rowtype. Ни одном из примеров нет индекса , как способа повлиять на выполнение for loop. А объяснить я прошу лишь одно - почему в случае 1 присвоение допустимо, а в случае 2 - нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2017, 17:11 |
|
||
|
а че, так можно было ?
|
|||
|---|---|---|---|
|
#18+
логика как бы понятна, но могли бы также логично сделать и по-другому константное (immutable) значение можно инициализировать динамическим runtime-значением обернули бы fetch как-то так Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2017, 17:16 |
|
||
|
а че, так можно было ?
|
|||
|---|---|---|---|
|
#18+
booby, в документации это так назвали, не знаю почему, пускай будет, record variable, т.е. неявно объявленная переменная типа %ROWTYPE. record Name for the loop index that the cursor FOR LOOP statement implicitly declares as a %ROWTYPE record variable of the type that cursor or select_statement returns. 2andrey_anonymous я нигде не писал, что недопустимо. Аргументации, чтобы назвать использование этой фичи правильным документированным способом решать задачи явно не хватает. Но это пускай каждый сам за себя решает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2017, 17:27 |
|
||
|
а че, так можно было ?
|
|||
|---|---|---|---|
|
#18+
nxx, обрати внимание, что тебе пришлось буферизировать свою константу через изменяемую переменную. Т.е - проделать дополнительную работу с невысказанной целью. Одна из традиций логических предпочтений опирается на соотнесение выбранных правил логики с некоторой реальностью. Здесь "могла бы столь же логично" должно опираться на какую-то мыслимую историю, соотносимую с практическим миром возможностей. В случае For loop проектировщики языка предотвращают ошибку программиста, ломающую заданное в условиях цикла его число шагов. То есть - это охрана работы алгоритма цикла. Изменение значения переменной в cursor for loop не может сломать сам цикл. С точки зрения синтаксиса - цикл целиком безопасен. Требуя неизменности переменной цикла cursor for loop от разработчиков языка дай им ясный категорический императив, приводящий к более безопасной инфраструктуре выполнения программы. Не с точки зрения - могут ли быть ошибки в программировании бизнес логики (от таких ошибок нет защиты), а с точки зрения безопасности работы самой программы - она уйдет в область не инициализированных адресов и завершит работу авостом, или впадет в бесконечный цикл или еще какая-то катастрофа ее ожидает в конструкции cursor for loop именно от факта изменения переменной цикла. Главный поинт в том, что текущее значение переменной цикла в cursor for loop не соотносится ни с возможностью продолжения, ни с возможностью прекращения цикла. Цикл нельзя сломать, воздействуя на неё. Как повысится безопасность языка, если такое воздействие взять и запретить? Должен быть либо смысл запрета, либо запрет ограничивает возможности языка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2017, 17:37 |
|
||
|
а че, так можно было ?
|
|||
|---|---|---|---|
|
#18+
user1241, если там так на самом деле написано - то это простой дефект документации. Это не индекс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2017, 17:38 |
|
||
|
а че, так можно было ?
|
|||
|---|---|---|---|
|
#18+
user1241Аргументации, чтобы назвать использование этой фичи правильным документированным способом Пока что не хватает аргументации, чтобы назвать использование этой "фичи" неправильным. 1. Практика: - Логически два приведенных мной примера эквивалентны. - Контрпример отсутствует. По сути курсорный for loop можно рассматривать как синтаксический сахар, обертку вокруг варианта 1. 2. По документации - уже не раз отмечено в этом топике, что использовать курсорный индекс можно, НО не в качестве lvalue . Что же касается курсорного цикла - то ссылаться на record variable можно без упомянутого ограничения . Таким образом, присвоение значений атрибутам record variable - легально. 3. Поднимем ставки по документации: http://www.oracle.com/us/corporate/pricing/olsa-ru-v111003-070656.pdf ORACLE DOES NOT GUARANTEE THAT THE PROGRAMS WILL PERFORM ERROR-FREE OR UNINTERRUPTED OR THAT ORACLE WILL CORRECT ALL PROGRAM ERRORS. ...THERE ARE NO OTHER EXPRESS OR IMPLIED WARRANTIES OR CONDITIONS, INCLUDING WARRANTIES OR CONDITIONS OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. Судя по этому ДОКУМЕНТУ, ПО Oracle вообще нельзя применять в какой-либо PARTICULAR PURPOSE, а все истории про высокую доступность, надежность и прочее - суть маркетинговый буллшит. Сливаем компоненты? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2017, 17:45 |
|
||
|
а че, так можно было ?
|
|||
|---|---|---|---|
|
#18+
user1241При этом никто пока, что даже примеров, когда эта техника может реально сократить код, не представил. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. .... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2017, 17:47 |
|
||
|
а че, так можно было ?
|
|||
|---|---|---|---|
|
#18+
stax..user1241При этом никто пока, что даже примеров, когда эта техника может реально сократить код, не представил. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. .... stax 20613006 не оно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2017, 17:53 |
|
||
|
а че, так можно было ?
|
|||
|---|---|---|---|
|
#18+
andreymx 20613006 не оно? оно, я просто долго набирал/постил но по любому "переменная" за рамками loop не доступна ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2017, 18:08 |
|
||
|
а че, так можно было ?
|
|||
|---|---|---|---|
|
#18+
nxxлогика как бы понятна, но могли бы также логично сделать и по-другому константное (immutable) значение можно инициализировать динамическим runtime-значением обернули бы fetch как-то так Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. імхо оракля примерно (не константой) так и обявляет переменных две уровня блока и уровня цикла Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2017, 18:16 |
|
||
|
а че, так можно было ?
|
|||
|---|---|---|---|
|
#18+
По поводу актуальности. andreymx Код: sql 1. 2. 3. 4. 5. 6. stax.. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. .... stax Где-то может и сойдёт, покрутить где-нибудь в мозговых задачках, но, тёмную сторону скрыли, в production я бы пилить такое не стал. Трудно назвать хорошим код, который ломается при добавлении столбца в таблицу или вьюшку неизвестно где в N мест. см. что Кайт пишет по этому поводу: https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:676611400346196844 A reader Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. I guess this means that existing code that uses %ROWTYPE will break if a virtual column is added to a table. Any way around this? Thanks Tom KyteIt is what it is. Not any different than if you were not granted insert on that column. Even worse would be if your code use the record type to blindly insert all columns without thought - AND someone adds a new column with a default value. Guess what would happen - you would defeat the default. Recommend always - always - to use the column list when inserting - always. insert into t ( c1, c2, c3, .. ) values .... never insert into t values ( ...); I don't like the insert into T values <record> "ability" at all - a very shaky proposition. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2017, 14:04 |
|
||
|
а че, так можно было ?
|
|||
|---|---|---|---|
|
#18+
user1241По поводу актуальности. Где-то может и сойдёт, покрутить где-нибудь в мозговых задачках, но, тёмную сторону скрыли, в production я бы пилить такое не стал. Трудно назвать хорошим код, который ломается при добавлении столбца в таблицу или вьюшку неизвестно где в N мест. см. что Кайт пишет по этому поводу: https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:676611400346196844 пропущено... пропущено... Вы про * 1) лень было поля перечислять для примера 2) покажите, как добавление поля сломает приведенный код? ...... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2017, 14:13 |
|
||
|
а че, так можно было ?
|
|||
|---|---|---|---|
|
#18+
user1241Elic, По мне так, здесь ключевые слова implicitly declares. В обычном For Loop тоже variable, не константа , но менять нельзя: FOR LOOP Index The index of a FOR LOOP statement is implicitly declared as a variable of type INTEGER that is local to the loop. The statements in the loop can read the value of the index, but cannot change it. Statements outside the loop cannot reference the index. С одной стороны менять cursor FOR LOOP index в документации не запрещено. С другой стороны менять неявно объявленные переменные без надлежащих причин, про которые не написано, что их можно менять, bad practice. сугубо имхо. вы прямо с дуба рухнули, чесслово. как в качестве индексной переменной может использоваться константа ? i - то меняется, а не сохраняет неизменное значение на протяжении всего жизненного цикла в остальном - в документации все четко сказано, читать можно, менять нельзя. переменяет эту переменную нечто, но не statements inside loop, никакого противоречия ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2017, 14:18 |
|
||
|
а че, так можно было ?
|
|||
|---|---|---|---|
|
#18+
stax..Вы про * 1) лень было поля перечислять для примера 2) покажите, как добавление поля сломает приведенный код? ...... stax Если * нет, null логично прописать в запросе (и с явным курсором в том числе, над очень экзотическими ситуациями можно подумать, но врят ли кто-то реально использует до такой степени эту фичу) 11g+ Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2017, 14:43 |
|
||
|
а че, так можно было ?
|
|||
|---|---|---|---|
|
#18+
user1241Если * нет, null логично прописать в запросе ШО?! В запросе логично прописывать те поля, с которыми работаешь. И %rowtype объявлять не от таблицы, а от курсора. Соответственно, в insert перечисление полей - тоже must have. И все нормально с "фичей" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2017, 14:48 |
|
||
|
а че, так можно было ?
|
|||
|---|---|---|---|
|
#18+
+По поводу актуальности: andrey_anonymoususer1241С учетом, что примеров нет Попробуйте объяснить разницу между Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. и Код: plsql 1. 2. 3. 4. 5. 6. 7. Что до практических примеров - то в некоторых случаях обогащение в ETL вполне можно рассматривать как таковой. Желательно более полный пример, пусть с ETL, с тем как это используется. И желательно, где нет выше описанной проблемы, и код, который не было бы лучше переписать через bulk collect / forall. andrey_anonymous3. Поднимем ставки по документации: По поводу отсутствии гарантии исправления ошибок, с этим так или иначе можно везде столкнуться, кто-то видит одно, кто-то видит иначе, оракл имеет право на свое мнение, по крайней мере об этом честно пишет. Мне кажется тут больше, чтобы отсеять совсем неадекватов. При серьезных претензиях, сомневаюсь, что этот пункт будет играть определяющую роль в суде. имхо. Предлагаю от темы документации перейти к теме использования в production системах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2017, 14:51 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39483977&tid=1885638]: |
0ms |
get settings: |
7ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
147ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
| others: | 220ms |
| total: | 443ms |

| 0 / 0 |
