|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
Добрый день, я написал PL/SQL функцию которая ожидает несколько чисел-параметров. Код: plsql 1. 2. 3. 4.
Хочется запретить передачу null в качестве параметров на стадии компиляции. В логике этой моей функции null никогда не полезен, и его появление всегда говорит об ошибке в программе, в моем случае. Я могу сделать обработку в ран тайм с nvl(), или бросить Exception, но не знаю PL/SQL достаточно глубоко, чтобы объявить параметры функции "null не принимает". Мне неизвестно, возможно ли вообще такое, потому что: Код: plsql 1. 2. 3. 4.
В этом примере можно обмануть компилятор. В других языках есть конструкции позволяющие синтаксически запретить null в параметрах, может и PL/SQL это умеет? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2020, 18:26 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
НеофитSQL, Не умеет ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2020, 18:29 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2020, 18:30 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
НеофитSQL, Можно заморочиться Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2020, 18:34 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2020, 18:36 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
env, НеофитSQL на стадии компиляции. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2020, 18:37 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
НеофитSQL В других языках есть конструкции позволяющие синтаксически запретить null в параметрах ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2020, 18:40 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
динамически получаемые параметры на этапе компиляции еще неизвестны. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2020, 18:41 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
env, спасибо. применить не смогу, но прочитав пример я увидел как можно через субтипы ограничивать интервалы значений. Может когда-нибудь пригодиться. xtender, ваши ответы бывают полезны и информативны. сегодня не тот случай, наверное погода. Посмотрите конструкцию C/C++ proc( const TYPE& x ), где параметр передается по ссылке, но сама ссылка нулем быть не может. При этом функция прекрасно принимает константы типа, и можно писать proc( 5 ) хотя язык не определяет указатели на такие литералы. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2020, 18:53 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
istrebitel В точку. Мои поиски не нашли эту тему, спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2020, 19:05 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
НеофитSQL, subtype? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2020, 21:44 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
НеофитSQL ... Посмотрите конструкцию C/C++ proc( const TYPE& x ), где параметр передается по ссылке, но сама ссылка нулем быть не может. При этом функция прекрасно принимает константы типа, и можно писать proc( 5 ) хотя язык не определяет указатели на такие литералы. 1) IN параметры в PL/SQL всегда pass by reference-to-const, то есть 100% точно аналогичны C++ параметрам вида Код: plaintext 1.
, и ни при каких обстоятельствах не могут быть иными, by design. Ясность и железобетонность работы IN параметра не только автоматически освобождает мозг от вопроса правильности использования модификатора const, но и, при понимании того, что это именно и только Код: plaintext 1.
, и никогда ничто иное, так же автоматически, дает все преимущества работы по ссылке. 2) В отличии от C++, на который вы ссылаетесь, в PL/SQL нет понятия "неинициализированная переменная", это одна из причин, по которой в PL/SQL нет понятия "неопределённое поведение". Все переменные всегда обязательно инициализируются значением, и для unconstrained типов таким значением по умолчанию является Null (Null в PL/SQL это значение ), а для ограниченных на Not Null типов вы обязаны указать начальное значение, согласующееся с прочими ограничениями типа. 3) Явно объявленное ограничение типа сорта Is Not Null всегда реализуется в виде атрибута типа значения, проверяемого в runtime, оно принципиально не может быть проверено во время компиляции. Исключением могли бы быть (может быть, и являются) Simple_* типы, т.к. на этапе компиляции проверка для них не требуется, а фактически она всё равно возникает во время выполнения, как результат встроенного приведения типа фактического параметра к типу формального, при их различии. Именно и специально поэтому, если от кода требуется предельно и максимально достижимая производительность, то и для входного параметра и внутри такого кода применяют не ограниченный на Not Null Тип. 4) Сравнивая PL/SQL с "другими языками", подразумевая это явно или нет, вы даете отсылки к таким "другим языкам", которые являются языками программирования , но PL/SQL таковым не является . В том смысле не является, в каком под "языками программирования" понимаются языки программирования общего назначения . Таким языкам - языкам программирования общего назначения, запрещено нарушать закон исключения третьего. И в этом существо дела. PL/SQL проходит по другой категории - [i]процедурные расширения [/i] языка SQL. Хотя он мог бы и языком программирования являться, но компания - владелец языка, в стране своего существования, не рискует даже пытаться озвучивать такого сорта произношение, дабы не возбуждать академически образованную общественность, а все, что делала и делает в этом плане, делает так, чтобы и подозрений не могло возникать о возможности и допустимости использования PL/SQL в отрыве от инфраструктуры Oracle Database. PS Вы пишите такую ахинею, да еще с такой уверенностью в том, что понимаете, что пишите, что ссылка документацию - проявление неслыханной к вам терпимости. Маэстро, бросайте вы эту фигню, немедленно лифтуйтесь на 5-7, вообще, на сколько возможно позиций вверх. Вам в начальники срочно надо. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 01:05 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
booby ... дает все преимущества работы по ссылке. ... Ну, со всеми недостатками впридачу, конечно. Алиасинг не отслеживается компилятором. Точнее, иногда компилятор его видит, но сообщает об этом только в виде предупреждения. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 01:18 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
booby ... Именно и специально поэтому, если от кода требуется предельно и максимально достижимая производительность, то и для входного параметра и внутри такого кода применяют не ограниченный на Not Null Тип. ... здесь тоже, с оговоркой на то, что Simple_* типы самые быстрые by design. И Not Null у них, похоже, чуть-чуть другой системы. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 01:32 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
booby . . . простыня . . Другими словами, как сказали выше раньше и короче, в PL/SQL невозможно отказаться от null параметра даже там, где ожидается 2-байтное число. Придется с этим жить, у каждого языка свои сильные и слабые стороны. Пережил Итаниум, переживу и это. автор4) Сравнивая PL/SQL с "другими языками", подразумевая это явно или нет, вы даете отсылки к таким "другим языкам", которые являются языками программирования, но PL/SQL таковым не является. Лол, хорошо. оставайтесь пока при этом мнении :) Когда-нибудь почитайте Кнута. Станет скучно - попробуйте передать null в putchar( int c ), расскажите как получилось. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 02:36 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
booby ... в PL/SQL нет понятия "неопределённое поведение". ... Впрочем, есть - в части значений OUT параметров вызываемой процедуры при возникновении в ней необработанной ошибки. Однако это не подразумевает возможности неконтролируемого падения падения процесса, обычно ассоциируемого с термином "неопределенное поведение" как неотъемлемая возможность такого поведения. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 02:59 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
НеофитSQL ... попробуйте передать null в putchar( int c ), расскажите как получилось. Вы бы сняли клоунский колпак. Шутки у вас плоские, если всё ещё считать, что вы "продолжаете шутить". ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 03:01 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
НеофитSQL ... 2-байтное число... что это, ты что - пьёшь по ночам? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 03:05 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
НеофитSQL C/C++ proc( const TYPE& x ) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
Ты вообще понимаешь разницу run-time/compile time? зы. Вообще, это ж додуматься надо было именно С в таком контексте упомянуть... ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 03:44 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
НеофитSQL Станет скучно - попробуйте передать null в putchar( int c ), расскажите как получилось. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
НеофитSQL Лол, хорошо. оставайтесь пока при этом мнении :) Когда-нибудь почитайте Кнута. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 03:50 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
booby, Форум немного не так работает то что "по прочтении сжечь" лучше отправлять на почту у меня в профиле :) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 05:18 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
xtender Не советуй того, что сам не осилил... Да и судя по тому, как ты осваиваешь документацию по ораклу, сомневаюсь, что осилишь. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 06:39 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
xtender Код: plaintext 1. 2. 3. 4. 5.
Не совсем честное сравнение, Саян. Скорее всего в твоем компиляторе, даже несмотря на с++11, NULL определен как Код: plaintext 1.
(либо идет замена на таковое на этапе компиляции), так что твой NULL имеет тот же тип int с нулевым значением. Если ты же ты хотел туда передать нулевой указатель nullptr (по смыслу наиболее близкое значение к ораколовому null), то код не скомпилится из-за разности типов. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 09:31 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
А мне интересно, что Саян пишет... Так что польза есть :) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 09:58 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
AmKad ... Если ты же ты хотел туда передать нулевой указатель nullptr (по смыслу наиболее близкое значение к ораколовому null)... Вы чё, белены объелись? Расскажи, из какой ноздри таку бредятину доставать надо? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 10:14 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
booby AmKad ... Если ты же ты хотел туда передать нулевой указатель nullptr (по смыслу наиболее близкое значение к ораколовому null)... Вы чё, белены объелись? Расскажи, из какой ноздри таку бредятину доставать надо? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 10:31 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
AmKad booby пропущено... Вы чё, белены объелись? Расскажи, из какой ноздри таку бредятину доставать надо? Правильно ли я понял, что вы утверждаете буквально следующее: При объявлении в разделе деклараций процедуры/функции/анонимного блока переменной типа, например, pls_integer, на стеке выделяется память не под значение для этой переменной, а всегда и обязательно под адрес к выделяемому в куче значению? И значение Null в Pl/SQL всегда опознается по нулевому значению этого адреса? Я, правда, не знаю, как оно на самом деле, расскажите. Я свою белену закатаю в трубочку, если вы как-то сможете обосновать своё суждение. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 11:01 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
кстати, даже если на самом деле используется любая форма косвенности, это означает лишь то, что что получение нуля в качестве адреса в параметре в PL/SQL невозможно в принципе. Поэтому, и в таком случае тоже, аналогия с передачей nullptr в параметр в С++ - некорректна. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 11:22 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
booby, имхо в pl/sql есть признак на null различает же он как-то null и '' пустую строку ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 11:25 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
Stax booby, ... различает же он как-то null и '' пустую строку ..... stax я уже не помню, где он их на самом деле различает. Но право вдруг, когда-нибудь, начать повсеместно различать - точно за собой оставляет, даже если не будет делать так никогда. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 11:34 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
В каждом языке есть свои особенности и их нужно учитывать при написании кода, однако воевать с ними непродуктивно и бессмысленно. Stax null и '' пустую строку Ну зачем ты это упомянул, сейчас начнется по 100500 кругу ... ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 11:34 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
AmKad, Подумай хорошенько... Посмотри контекст обсуждения, внимательно посмотри мой пример и еще раз подумай... Зы. Свои утверждения тоже хорошенько обдумай. Booby кое о чем уже намекал ещё до появления тебя в теме. Не вынуждай комментировать твои измышлизмы... Зы2. Пассаж про "мой" компилятор мне понравился ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 11:36 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
НеофитSQL, вот лобовое решение create or replace function MyAdd( a in integer, b in integer ) return integer is begin if a is null or b is null then raise_application_error(-20999,'Не заданы значения параметра'); end if; return a+b; end; / select MyAdd(1,2) from dual; select MyAdd(1,null) from dual; ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 11:54 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
Stax booby, имхо в pl/sql есть признак на null различает же он как-то null и '' пустую строку ..... stax Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Код: plsql 1. 2. 3. 4.
Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Код: plsql 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 12:03 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
booby Правильно ли я понял, что вы утверждаете буквально следующее: При объявлении в разделе деклараций процедуры/функции/анонимного блока переменной типа, например, pls_integer, на стеке выделяется память не под значение для этой переменной, а всегда и обязательно под адрес к выделяемому в куче значению? На контекст моего утверждение явно указывает мой вопрос, адресованный Вам. Ну, а смысл появления nullptr в c+11, как более безопасная альтернатива NULL, думаю Вам хорошо известен. xtender AmKad, Подумай хорошенько... Посмотри контекст обсуждения, внимательно посмотри мой пример и еще раз подумай... xtender Зы2. Пассаж про "мой" компилятор мне понравился ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 12:04 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
AmKad Ты передал честный int с нулевым значением в int-параметр функции. Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 12:14 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
Les, НеофитSQL Хочется запретить передачу null в качестве параметров на стадии компиляции В эксепшн автор и сам уже умеет ) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 12:15 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
xtender AmKad Ты передал честный int с нулевым значением в int-параметр функции. Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 12:33 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
xtender Ты вообще понимаешь разницу run-time/compile time? С большой долей вероятности автор топика имел ввиду примитивные типы данных в некоторых распространенных языках программирования, которые действительно не могут быть null и соответствие типов проверяется в большинстве случаев при компиляции. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 12:34 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
AmKad, О том, что booby написал ещё в самом начале: про сишные UB куда ни плюнь...сравни сишный "int x;" и pl/sql "x int;" Уж что-что, а си и даже современные плюсы сюда в контекст пихать мягко говоря не стоило... ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 12:46 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
graycode xtender Ты вообще понимаешь разницу run-time/compile time? С большой долей вероятности автор топика имел ввиду примитивные типы данных в некоторых распространенных языках программирования, которые действительно не могут быть null и соответствие типов проверяется в большинстве случаев при компиляции. Зы. Пример ошибки времени компиляции выше был: 22203366 ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 12:51 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
сорри, был глюк какойто, д.б. так: AmKad ... На контекст моего утверждение явно указывает мой вопрос, адресованный Вам. Вы задали мне такой вопрос: AmKad..попробуйте ответить на вопрос: какой способ передачи параметров в функцию в С/С++ (без учета наличия перегрузок) позволяет логически сделать параметр необязательным (непроинициализированным) и в вызываемой функции определить, был ли передан (проинициализирован) тот или иной параметр Ответа на него я не знаю , в частности потому, что вообще отношения ни C, ни С++ не имею. Технически, "в стиле C/C++", на уровне подсистемы передачи параметров, это можно было бы делать передачей как раз nullptr для пропущенного параметра, изолированного в промежуточную ссылочную переменную. Однако Вы, задавая такой такой вопрос, вероятно не просто знаете на него правильный ответ, но и понимаете, как он обосновывает утверждение о том, что nullptr "по смыслу наиболее близкое значение к ораколовому null". Что точно вы вы хотели сказать своим ответом в виде вопроса, если перевести его в утвердительное предложение? AmKad ... ... Ну, а смысл появления nullptr в c+11, как более безопасная альтернатива NULL, думаю Вам хорошо известен. В контексте данного конкретного топика это выглядит вообще как весёлая шутка: Т.е., перевожу: С++ развивается от C в направлении к Ada, в смысле непрерывного укрепления строгости системы типов, а PL/SQL с рождения продрейфовал от Ada к "процедурным расширениям SQL", сразу и явно пожертвовав строгостью системы типов, путём внедрения встроенного преобразования типов для значений. Спасибо, посмеялся вместе с Вами. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 13:19 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
xtender AmKad, О том, что booby написал ещё в самом начале: про сишные UB куда ни плюнь...сравни сишный И проблему неинициализированных переменных нельзя назвать чисто сишной. Хотя, уверен, твой C++ компилятор при включении соответствующих опций-ворнингов обязательно укажет на них. Мой MSVC даже не дает компилировать такой кусок кода. Если мы хотим продемонстрировать UB через передачу параметров по ссылке, можно постараться придумать куда более общий пример c разыменованием указателя. Код: plaintext 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 13:29 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
AmKad, Про NULL в первом примере было вообще о понимании разницы null в pl/sql и в сях и с намёком про c++11 ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 13:37 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
booby Ответа на него я не знаю , в частности потому, что вообще отношения ни C, ни С++ не имею. Дополнение: в С+11 появился более безопасный способ указать нулевой указатель: nullptr. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 13:38 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
AmKad, И как это должно быть связано с утверждением об эквивалентности нулевого указателя и Null, с учетом того (если я правильно понял ваши отговорки), что вы уже не готовы утверждать, что по адресу, ассоциированному с переменной лежит не значение, а ссылка на него. Кстати, это правда мог бы быть простой вариант реализации за малую цену общей производительности. Но даже, если это на самом деле так, и Вы абсолютно правы в своем "почти приравнивании" nullptr в C++ и Null в pl/sql, а белены объелся именно я, это не отменяет того, что в логическом отношении PL/SQL-Null - это самостоятельное значение. Вся математика должна единообразно интерпретировать значение нулевого указателя, во первых, а во вторых, это не создает возможности передать нулевой указатель в ссылочном IN-параметре. В этом смысле сравнение там, где вы именно именно в качестве передаваемого параметра nullptr используете как аналогию, для меня остаётся как выглядящее неприемлемым. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 15:11 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
booby, В оракле в случае переменных простых типов null - это спец значение 0xFF. Объекты же как и коллекции в pl/sql тоже могут быть неинициализированными ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 15:25 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
xtender booby, ...Объекты же как и коллекции в pl/sql тоже могут быть неинициализированными если подразумевается, имеющими значение 0xFF, то в русском языке это называется - всегда инициализированы ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 15:31 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
xtender В оракле в случае переменных простых типов null - это спец значение 0xFF. А вот тут неясно что под капотом. Кто знает может как в OCI - indicator variable в придачу. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 15:31 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
В любом случае - возможность указать NOT NULL для IN/IN OUT параметров (runtime проверка естественно) было бы неплохо хотя и явная поверка в теле stored objects не смертельно. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 15:37 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
booby всегда инициализированы ок, аккуратнее так сказать - всегда инициализированы, по крайней мере, частично. (в предположении множественных несовпадающих реализаций спецификации языка). ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 16:10 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
booby xtender booby, ...Объекты же как и коллекции в pl/sql тоже могут быть неинициализированными если подразумевается, имеющими значение 0xFF, то в русском языке это называется - всегда инициализированы ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 16:12 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
Точнее даже "почти как в плюсах", тк объектные переменные тоже могут быть null в pl/sql, т.е. сам объект не создаётся по умолчанию ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 16:15 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
SY В любом случае - возможность указать NOT NULL для IN/IN OUT параметров (runtime проверка естественно) было бы неплохо хотя и явная поверка в теле stored objects не смертельно. SY. насколько я понимаю, при передаче фактического параметра, Not Null на нем проверяется именно подсистемой передачи параметров. И это не так, когда передается фактическое значение в ограниченный на размер/диапазон тип формального параметра, размер для подтипов Number/Varchar2 точно не проверяется, диапазоны на самом деле, не проверял. Вообще, конечно, с системой типов бывает досада - тут строгие, тут расслабили, а там вообще рыбу завернули. not Null явно на параметре определенный, должен быть эквивалентен локальному объявлению подтипа. В общем, мне с разбегу не видно, почему это плохо и не надо давать такой возможности. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 16:18 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
booby, хотя, наверно, это усложнение компилятора - если это функция глобальной области видимости - где-то должны появиться глобально видимые определения типов. Для пакетов не критично, а для самостоятельных процедур/функций - куда их девать - вроде скрытый пакет в схеме, потенциально сильно связывающий оставшийся код, тогда должен появляться. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 16:26 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
booby хотя, наверно, это усложнение компилятора - если это функция глобальной области видимости - где-то должны появиться глобально видимые определения типов. Вызывающий код уже делает все проверки и знает тип как formal так и actual параметров так-что добавить атрибут NULL/NOT NULL к formal параметру и проверять actual на NULL если formal NOT NULL несложно. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 16:56 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
SY, для дого, чтобы оно работало в рантайме, формальный тип должен быть известен на этапе компиляции. твое предложение сводится, по сути, к тому, что определение типа формального параметра должно сидеть прямо в спецификации вызываемой процедуры, это как минимум, другая процедура привязки. Либо, то, что говорил я - определение типа в момент компиляции динамически складывается/добавляется в какое-то "общее место", это, может быть, дополнительный проход на этапе компиляции. Первое, вероятно, не в ладах будет с совместимостью со старыми клиентами, второе само по себе будет плохо работать в условиях наличия большого объема разнообразного по назначению кода в схеме. Хотя "в принципе", сделать могли бы. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 17:06 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
SY В любом случае - возможность указать NOT NULL для IN/IN OUT параметров (runtime проверка естественно) было бы неплохо хотя и явная поверка в теле stored objects не смертельно. SY. Это было бы хорошо, иначе приходится в теле сразу или проверять или обнулять через nvl. Я вижу тут бурные дебаты пошли во все стороны, поэтому сужу вопрос только для простых скалярных встроенных типов. Выглядит недоработкой что поля типа INTEGER в таблице можно объявить как НЕ-nullable, а параметры в функции - нельзя. Возможно, это однажды было великой концепцией что даже один байт всегда передается по ссылке и следовательно, может отсутствовать, и возможно, SQL стандарт когда-нибудь предложит альтернативу для встроенных типов. PL/SQL часто помогает сгладить этот угол. Например, следующее присваивание обрабатывает null не вызывая исключение: Код: plsql 1. 2. 3. 4.
А дальше уже хуже, т.к для null PL/SQL не соблюдает правила булевой алгебры, а некоторые операции с ним запрещены: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
Попытки передать null в putchar() закончились предсказуемым неуспехом (передался int 0, что не то же самое), хотя не всем еще понятно почему. Ответ: при передаче по параметра по значению невозможно передать null на значение, только само значение. Если функция просит один байт, в C++ ей придется скормить ровно один байт, не больше, не меньше (в C немного по другому). Пример с (const TYPE& val) передает по ссылке, но тоже запрещает передать null, что используют программисты в C/C++. Когда возможность передать null приветствуется, используются указатели (TYPE* pval). Синтакс работы с указателями и ссылками отличается в C/C++, напоминая программистам о возможности присутствия null. Например, битовое копирование в первом случае всегда безопасно, т.к.синтакс гарантирует наличие объекта Код: plaintext 1.
битовое копирование во втором случае использует указатель, что подсказывает программисту что можно нарваться на NULL: Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 17:10 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
xtender AmKad, Про NULL в первом примере было вообще о понимании разницы null в pl/sql и в сях и с намёком про c++11 ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 17:27 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
НеофитSQL, Этот идиотизм уже утомил. Даже комментировать этот бред не буду. Иди учи плюсы в соответствующую ветку форума. Ещё один такой поток бреда и будет бан за офтоп. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 17:28 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
AmKad, Намёк был про определение NULL. Идите обсуждайте такое с Неофитом в соответствующем форуме ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 17:31 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
xtender, Хорошо. Прекращаю оффтоп. Но, заметь, про C++ первым пример дал ты, а твои намеки так и остались непонятыми. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 17:33 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
НеофитSQL PL/SQL часто помогает сгладить этот угол. Например, следующее присваивание обрабатывает null не вызывая исключение: Код: plsql 1. 2. 3. 4.
Мой комплимент был преждевременным. Оракл обещает что когда захочет, это поведение сломает. ОраклAlthough Oracle treats zero-length character strings as nulls, concatenating a zero-length character string with another operand always results in the other operand, so null can result only from the concatenation of two null strings. However, this may not continue to be true in future versions of Oracle Database. To concatenate an expression that might be null, use the NVL function to explicitly convert the expression to a zero-length string. https://docs.oracle.com/cd/B19306_01/server.102/b14200/operators003.htm То есть, конкатенацию с null делать не рекомендуется, ибо такой код может перестать работать неожиданным образом в будущем. Другими словами: вместо str1 || str2 Оракл рекомендует писать nvl(str1,'') || nvl(str2,'') ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 17:39 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
НеофитSQL НеофитSQL PL/SQL часто помогает сгладить этот угол. Например, следующее присваивание обрабатывает null не вызывая исключение: Код: plsql 1. 2. 3. 4.
Мой комплимент был преждевременным. Оракл обещает что когда захочет, это поведение сломает. ОраклAlthough Oracle treats zero-length character strings as nulls, concatenating a zero-length character string with another operand always results in the other operand, so null can result only from the concatenation of two null strings. However, this may not continue to be true in future versions of Oracle Database. To concatenate an expression that might be null, use the NVL function to explicitly convert the expression to a zero-length string. https://docs.oracle.com/cd/B19306_01/server.102/b14200/operators003.htm То есть, конкатенацию с null делать не рекомендуется, ибо такой код может перестать работать неожиданным образом в будущем. Другими словами: вместо str1 || str2 Оракл рекомендует писать nvl(str1,'') || nvl(str2,'') ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 17:52 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
НеофитSQL, А в каких языках есть проверка входных параметров на NULL? упд. И как определён NULL в этих языках? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 18:04 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
НеофитSQL, угол, сломает, обещает Такое впечатление, что вы в степях росли. это не угол, а бинарная операция. Ломать есть всегда два варианта: Либо так, что вообще никакой предшествующий код не будет совместим со следующей усорвершенствованной версией, тут и беды нет - просто все сядут писать прикладной код заново, и будут заняты на следующие 40 лет. Либо будет введена новая бинарная операция, которая будет давать Null в результате конкатенации не пустой строки с Null-строкой. В этом ни беды, ни смысла нет. Жаль только, что переписывать ничего не надо будет. автордля null PL/SQL не соблюдает правила булевой алгебры соблюдает . только она не на двоичной логике построена, а на троичной, с оговоркой на то, что третьим логическим значением выступает именно Null, что формально не очень честно, но на практике еще никого не напрягло ни разу. Про параметры - используйте объявления подтипов с not null. В своем коде вы всегда найдете , где их разместить, и почти всегда в прикладных задачах вы не сможете измерить оверхед от такого объявления, так как в 100% (по вероятности) случаев критичным является sql. если ваш pl/sql код нестоек к Null, просто защищайте его от Null снаружи, при обращении из sql. снаружи, кроме nvl есть case, decode, coalesce вот и все страдания. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 18:17 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
2S.Y. по части not null параметров и определений полей в БД: говорят, что стоимостной оптимизатор в Oracle Database появился после покупки в 1994 году у DEC Rdb Database - вроде как взяли и перенесли к себе из неё чуть ли ни без изменения кода, хотя это и неважно. Так это или нет - не знаю, но я всегда не понимал, что помешало так же целиком перенести к себе из неё и идею Domain Names. Как по мне, так красота была бы неописуемая. Единственная причина, которую я для себя придумал, могла быть такой: Типа, это слабая идея, а мы вот щаз как выпустим объектные расширения, так нам сразу никакие Domain names никогда и не понадобятся. Если вправду, что-то на это похожее, то такие мысли я бы за техническую ошибку считал. В том смысле, что и объектные расширения поверх Domain Names, или прямо как их расширения, тоже гораздо веселее смотрелись бы, имхо. Сказка была бы, а не СУБД. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 19:02 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
env НеофитSQL, А в каких языках есть проверка входных параметров на NULL? упд. И как определён NULL в этих языках? Модератор попросил не обсуждать C/C++ в этой теме, я (или друге эксперты по C/C++) могу ответить на профильном форуме. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 19:52 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
booby автордля null PL/SQL не соблюдает правила булевой алгебры соблюдает . только она не на двоичной логике построена, а на троичной, с оговоркой на то, что третьим логическим значением выступает именно Null, что формально не очень честно, но на практике еще никого не напрягло ни разу. Я не встречался раньше в программировании с 3VL алгеброй, ну а почему бы и нет? Написал процедурку распечатать значения "булевой" переменной, и поигрался немного. Код: plsql 1. 2. 3. 4. 5. 6. 7.
Четвертого состояния материи булевой переменной пока не нашел, уже хорошо. Прошелся по таблице операций - вроде все совпадает как должно быть в 3VL по Клину. Проверил ленивое вычисление (в PL/SQL, где оно есть), выражения с null уважают ленивость, все как положено. Насколько я вижу, логические операции в PL/SQL следуют логике Клина, т.е. без противоречий. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 21:22 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
НеофитSQL, иди лучше в мсскл попробуй там, например, добавить новый параметр в функцию, не трогая старые вызова Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 21:42 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
andreymx НеофитSQL, иди лучше в мсскл попробуй там, например, добавить новый параметр в функцию, не трогая старые вызова Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
Я не уловил разницу. В PL/SQL я могу добавить параметр с атрибутом default, чтобы не трогать старый код. Перекомпилить, конечно же, придется. Смысл в том, что в mssql старый код сможет вызвать обновленную функцию без перекомпиляции? так? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 22:23 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
booby SY, для дого, чтобы оно работало в рантайме, формальный тип должен быть известен на этапе компиляции. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
Тут есть два варианта: 1. Проверка и преобразование типа производится вызывающим. 2. Проверка и преобразование типа производится вызываемым. Насколько я понимаю Oracle использует вариант 1. Лезет в DBA_ARGUMENTS и находит formal параметры и их тип, mode(IN/OUT/IN OUT) и.т.д. Так-что, как я понимаю, Oracle не составило бы большого труда добавить NULL/NOT NULL к определению formal параметра и хранить в SYS.ARGUMENT$ а вызывающему проверять actual параметр на NOT NULL если formal параметр NOT NULL. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2020, 18:38 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
SY, а вот такой код после усовершенствования должен остаться нерабочим, или скомпилироваться и правильно отработать? Код: plsql 1. 2. 3. 4. 5. 6. 7.
... ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2020, 18:48 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
Я попробовал следующий код, который выдал бы ошибку в в языке с более строгой проверкой типов. Для разнообразия вместо null использовал другое ограничение. Оракл скомпилировал перекаст на подтип не смущаясь, и поймал несоответствие во время исполнения. Код: plsql 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2020, 20:06 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
booby SY, а вот такой код после усовершенствования должен остаться нерабочим, или скомпилироваться и правильно отработать? Код: plsql 1. 2. 3. 4. 5. 6. 7.
... Ничего не понял. Это-же anonymous block - какие тут параметры? SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2020, 20:06 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
SY, Вы пишите примерно так: "вызывающий видит, и потому может..." В этом примере вызывающий (а здесь вызывающим является сам компилируемый блок кода) тоже всё "видит", и если не "может", надо бы определить - почему. То, что написали Вы, можно было бы интерпретировать так: - атрибут для Not Null у типа всегда есть, он может быть заполненным или нет, но обратиться и проверить его можно всегда. Значит, к объявлению любой переменной можно дописать Not Null, и для неё может быть использована ссылка на копию описателя базового типа, но с заполненным атрибутом. ----------- Иным способом это можно было бы представить так - увидев объявление n Number Not Null Default 0, компилятор расширяет раздел деклараций и, скрытым образом дописывает в него определение типа локальной области видимости. И я подразумевал точно это. Параметр с точки зрения использующего кода внутри процедуры в этом отношении неотличим от локальной переменной, он и есть - локальная переменная в области видимости процедуры. (И в этом смысле было бы хорошо, если бы доступный для описания его ограничений типа синтаксис, был доступен и для любых других переменных локальной области видимости, тогда предложенный вариант кода тоже окажется компилируемым) Но, в отличие от прочих переменных локальной области, у параметра есть внешние обязательства, нельзя обойтись скрытым расширением области объявлений - тип параметра должен быть известен и правильно использован, даже в случае, когда система не резервирует атрибут Nullable/Not Nullable, а использует его по необходимости ... Далее мне можно было бы слово в слово повторить предыдущий свой пост, но я разрешу себе этого не делать, sorry. ... Вообще, такого рода тему, можно было обсуждать и в терминах "автоматически выводимых типов", но я скептически на это смотрю - одно дело заменять "недостаточно точно типизированные" значения на "более точно" типизированные, это то, что я назвал "движением от C к Ada". Совсем другое дело, когда говорят - точный тип вам указывать не надо, компилятор умный и сам его выведет. Это дорога от "C в ад". Ну, в самом удачном случае, если всё-таки нужно как-то сохранять работоспособность кода - "от C к Basic-у". Только "производительность" тогда становится левым вопросом. вот примерно так я сейчас думаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2020, 22:28 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
SY, Кстати, в контексте упоминания Domain Names и прочих охов. Вообще говоря, на 99.99% было бы достаточно, если бы объявление сорта n table.field%type; Наследовало бы и Not Null от поля таблицы. По всем формальном признакам объявление типа поля в таблице обязано, и должно иметь все свойства допустимого и глобально видимого объявления типа. Именно к этому было и упоминание о Domain Names - новый логический конструкт позволил бы исправить старые ошибки. А без него - не больно-то и сделаешь. Кто возьмет на себя костюм супергероя? Там дедушки в компании. Хитрые, умные и осторожные... ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2020, 22:47 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
Помечтаю: Код: plsql 1.
Где "int not null" - новый скалярный тип, которому нельзя присвоить null, а также переменную которая может принимать значение null. Проверка компиляции. Код: plsql 1. 2. 3. 4. 5.
Все литералы будут иметь тип not null, поэтому присвоение констант не изменится. Преобразование переменных nullable в not null будет только в явном виде, через nvx (), где второй параметр not null. Такое частичное введение сильной типизации усложнит язык во имя решения второстепенной проблемы. PL/SQL сильной типизацией не страдал, лучше не начинать. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2020, 23:04 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
НеофитSQL, вас точно забанят. Терпимость терпимостью, но детский сад утомляет. Перестаньте, как тодлер, озвучивать все слова, которые вы только что услышали. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2020, 23:11 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
booby, Не флудите в моей теме, пожалуйста. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2020, 23:16 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
А, я неясно определил "вызывающий", "вызываемый". Это не пользовательский код а код самого Oracle который генерируется при компиляции. Например имеем: Код: plsql 1. 2. 3. 4. 5. 6. 7.
При компиляции Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
проверяется что есть p1 и ее параметры и посколько formal параметр date а actual параметр varchar2 генерируется код для преобразования v_param из varchar2 в date которое выполнится при вызове и только тогда выяснится преобразуется v_param в date или нет. Так что все что Oracle должен сделать это разрешить указание NULL/NOT NULL в formal параметре, добавить поле NULLABLE в SYS.ARGUMENT$, при компиляции дополнительно проверить NULLABLE в "что есть p1 и ее параметры" и если NOT NULL сгенерировать код проверки actual параметр на NULL при вызове. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2020, 23:18 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
SY, извините, я не могу это правильно прочитать. У меня чепуха какая-то получается... Во всяком случае, я попробовал пояснить свои соображения. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2020, 23:36 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
SY при компиляции дополнительно проверить Добавление not null в таком случае должно считаться изменением сигнатуры и инвалидировать все зависимости? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2020, 09:23 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
На выходных почитал SYS.STANDARD, пока мое решение для [subj] выглядит так: Код: plsql 1. 2.
Это похоже на уже предложенные идеи в начале темы, используя уже существующий для этих целей тип. Эффект: передача константы null ловится во время компиляции. передача переменной или выражения в 11.2 ловится только во время исполнения, но с внятным обозначением проблемы в строке вызывающего кода (что для меня важно, если кто-то передает в мой API неверные параметры, предпочтительно чтобы ошибка была очевидной, без необходимости лезть в мой код или в документацию) Можно сказать, проблема на 80% решена. Что я еще пробовал: определить новый скалярный тип (а не субтип) используя служебное слово "new". Идея в том, что подтипы и типы взаимозаменяемы на стадии компиляции, а мне нужно запретить неявный каст integer->simple_integer. Оракл ругается, что оператор "new" в определениях типе зарезервировал для системы, и юзерам это не дано. Когда будет время, я собираюсь посмотреть можно ли неявный каст запретить через тип-объект, чтобы осуществить следующее: Код: plsql 1. 2. 3. 4. 5. 6. 7.
пока я вижу что Оракл автоматически создает конструкторы для кастов в тип объекта, и их невозможно скрыть объявлением private, т.к. этот элемент языка отсутствует. Но нашел пару других механизмов, которые прячут конструкторы. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2020, 16:14 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
env SY при компиляции дополнительно проверить Добавление not null в таком случае должно считаться изменением сигнатуры и инвалидировать все зависимости? Это так. У процедур f( n in natural ) и f( n in naturalN ) разные сигнатуры. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2020, 16:40 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
Подкину свои пять копеек - Можно передавать NULL в параметре, а можно пропустить этот параметр. Это эквивалентные действия? Или нужны две проверки? И как быть если процедура головная и вызывается прямо из OCI? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2020, 13:41 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
Bfink, Задача изначально была запретить возможность передачи null на уровне компиляции в функции с простыми скалярными' параметрами. ТС (я) надеялся что наличие такого механизма позволит объявить функции "скалярными' и избавит от нудной но необходимой проверки на null в блоке валидации параметров функций. С тех пор я увидел что простого механизма это сделать не существует, а также вполне привык ожидать null в любом выражении. Температура среды? null. Вес объекта? null. Количество памяти отведенное под объект? null. Идентификатор типа переменной number которой присвоили null? Null, т.к. это ещё и тип. (Поймался разок при декапсуляции в DCOM). ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2020, 14:29 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
Bfink Подкину свои пять копеек - Можно передавать NULL в параметре, а можно пропустить этот параметр. Это эквивалентные действия? Или нужны две проверки? И как быть если процедура головная и вызывается прямо из OCI? Передать NULL означает передать значение actual параметра явно. Опустить параметр означает проверку а задан ли DEFAULT для formal параметра который и становится значением actual параметра. А ситуация Код: plsql 1.
отсечется еще при компиляции. A в OCI проверки думаю при OCIStmtPrepare. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2020, 14:43 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
НеофитSQL вполне привык ожидать null в любом выражении. Я бы еще добавил - манипуляция со строками, например, trim и опа - NULL ! ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2020, 14:57 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
SY, если нет default, то можно отличить фактический параметр NULL от пропущенного параметра внутри процедуры? OCI подкидывает прикольные вещи, например, я не умею породить NAN в binary_float внутри PLSQL, а OCI легко делает это на входе. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2020, 15:01 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
Bfink SY, если нет default, то можно отличить фактический параметр NULL от пропущенного параметра внутри процедуры? OCI подкидывает прикольные вещи, например, я не умею породить NAN в binary_float внутри PLSQL, а OCI легко делает это на входе. А что тут отличать? Если Oracle осуществляет проверки перед вызовом то тупо смотрим есть ли у formal параметрa default. Если Oracle осуществляет проверки вызываемом коде то скорее всего передается флаг опущен данный actual параметр или нет. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2020, 15:09 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
Bfink SY, если нет default, то можно отличить фактический параметр NULL от пропущенного параметра внутри процедуры? OCI подкидывает прикольные вещи, например, я не умею породить NAN в binary_float внутри PLSQL, а OCI легко делает это на входе. Насколько я понимаю PL/SQL, с точки зрения вызываемой процедуры пропущеных параметров не бывает, т.к. компилятор или выдаст ошибку в вызывающем коде, или (если указано значение default) подставит значение по умолчанию, как если бы оно было явным. Как результат, в вызываемой процедуре невозможно сказать, была она вызвана с пропущенным параметром, или с параметром, значение которого совпадает с default. Объявление процедуры proc( i in simple_integer ) защищает от явной передачи null в виде константы, но не защищает от передачи переменной или выражения, которые окажутся null. Породить float/NAN возможно, , или вы хотели это сделать как результат арифметической операции? f1 binary_float := BINARY_FLOAT_NAN; f2 binary_float := utl_raw.cast_to_binary_float('ffc00000'); ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2020, 15:35 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
НеофитSQL Породить float/NAN возможно А в NUMBER, который тип колонки в таблице? infinity можно. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2020, 17:26 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
Bfink А в NUMBER, который тип колонки в таблице? infinity можно. Видел NaN в Oracle'вой табличке (нужно было базу в PostgreSQL перегнать). Очень мучался. JDBC падало. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2020, 17:46 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev, Так вот же виновник ! з.ы. Example порадовал, видимо есть и запись с обратным условием Код: plsql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2020, 17:50 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
env з.ы. Example порадовал, видимо есть и запись с обратным условием ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2020, 18:09 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
Bfink НеофитSQL Породить float/NAN возможно А в NUMBER, который тип колонки в таблице? infinity можно. внутренний формат NUMBER позволяет хранить особые значения, но посмотрев на код Оракла я сомневаюсь что NaN поддерживается для этого типа, по крайней мере в PL/SQL. Почему я так считаю: - в STANDARD не определена константа для NUMBER_NAN как она определена для нескольких других типов. - имплементация стандартной функции NANVL(NUMBER,NUMBER) не учитывает такой возможности, просто возвращает первый параметр. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2020, 19:31 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
Я, кстати, не знал, что NUMBER позволяет хранить infinity. Только что поигрался с этим, обнаружил следующее: В PL/SQL присутствует полная поддержка для десятичной бесконечности, кроме определения NUMBER_INFINITY. Есть положительная и отрицательная бесконечности, определена функция "is infinite" для типа NUMBER, арифметика работает как ожидается, вычислительные функции тоже. Косинус от нее равен одному. Это говорит об отсутствии NaN/NUMBER, т.к. косинус от двоичной бесконечности это NaN. В PL/SQL ее можно кастить в BINARY_FLOAT и обратно, все отрабатывается корректно. Преобразование в строку работает, хотя вместо 'Inf' оно печатает совсем другое. В SQL с этой величиной печально, даже чтобы ее создать пришлось извернуться. SQL строго ловит арифметические переполнения и не разрешает касты от 1/0f. Когда получилось ее создать, все операции вылетают по ошибке, даже "is infinite" (иронично!). SQL явно не любит эту величину, а вот с бинарными бесконечностями работает нормально. А как вы столкнулись с десятичной бесконечностью в таблице? Пришла через импорт? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2020, 19:44 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
НеофитSQL Я, кстати, не знал, что NUMBER позволяет хранить infinity. Только что поигрался с этим, обнаружил следующее: В PL/SQL присутствует полная поддержка для десятичной бесконечности, кроме определения NUMBER_INFINITY. Есть положительная и отрицательная бесконечности, определена функция "is infinite" для типа NUMBER, арифметика работает как ожидается, вычислительные функции тоже. Косинус от нее равен одному. В PL/SQL ее можно кастить в BINARY_FLOAT и обратно, все отрабатывается корректно. Преобразование в строку работает, хотя вместо 'Inf' оно печатает совсем другое. В SQL с этой величиной печально, даже чтобы ее создать пришлось извернуться. SQL строго ловит арифметические переполнения и не разрешает касты от 1/0f. Когда получилось ее создать, все операции вылетают по ошибке, даже "is infinite" (иронично!). SQL явно не любит эту величину, а вот с бинарными бесконечностями работает нормально. А как вы столкнулись с десятичной бесконечностью в таблице? Пришла через импорт? Аж до 11.1 официально поддерживались inf для обратной совместимости с Oracle 5: 11.1 https://docs.oracle.com/cd/B28359_01/server.111/b28318/datatype.htm#CNCPT313 10.2 https://docs.oracle.com/cd/B19306_01/server.102/b14220/datatype.htm#sthref3810 9i https://docs.oracle.com/cd/B10501_01/server.920/a96524/c13datyp.htm#16210 8i https://docs.oracle.com/cd/A87860_01/doc/server.817/a76965/c10datyp.htm#743 7 https://docs.oracle.com/cd/A57673_01/DOC/server/doc/SCN73/ch6.htm авторThe following numbers can be stored in a NUMBER column:
авторIf a positive NUMBER value is extremely large and cannot be represented in the specified format, then the infinity sign (~) replaces the value. Likewise, if a negative NUMBER value is extremely small and cannot be represented by the specified format, then the negative infinity sign replaces the value (-~). ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2020, 20:23 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
НеофитSQL, Бесконечность получить просто, в колонку NUMBER нужно инсертить 1/0b или -1/0b для отрицательной бесконечности. А вот NaN так вставить не удалось. Зато OCI это делает легко - вставляешь строку в числовой параметр и в таблице очень плохое значение. Оно почему то больше нуля и его можно выделить на равенство. Особенно прикольно делать по этой колонке группировку. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2020, 20:26 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
xtender, А почему ты считаешь, что исчезла официальная поддержка в 11.2? По твоей ссылке - https://docs.oracle.com/cd/E11882_01/server.112/e40540/tablecls.htm#CBBFFHEB Numeric Data Types The Oracle Database numeric data types store fixed and floating-point numbers, zero, and infinity. Some numeric types also store values that are the undefined result of an operation, which is known as "not a number" or NAN. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2020, 20:34 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
xtender, > Positive and negative infinity ( generated only by importing from an Oracle Database, Version 5 ) Извините, я вовремя не прочитал что это невозможно, поэтому уже сделал в SQL+. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2020, 20:47 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
Bfink НеофитSQL, Бесконечность получить просто, в колонку NUMBER нужно инсертить 1/0b или -1/0b для отрицательной бесконечности. А вот NaN так вставить не удалось. Зато OCI это делает легко - вставляешь строку в числовой параметр и в таблице очень плохое значение. Оно почему то больше нуля и его можно выделить на равенство. Особенно прикольно делать по этой колонке группировку. У меня получилось вставить в поле NUMBER число больше бесконечности, но я не могу его назвать NaN, потому что оно себя так не ведет - судите сами Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2020, 20:53 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
НеофитSQL, Не "невозможно", а не поддерживается. Со всеми вытекающими... ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2020, 20:56 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
Bfink, Numeric не number. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2020, 20:56 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
xtender НеофитSQL, Не "невозможно", а не поддерживается. Со всеми вытекающими... К сожалению, документация Оракла - как та библия. Что захочешь, то и найдешь. https://docs.oracle.com/database/121/DRDAS/data_type.htm#DRDAS2 Вроде относится к 12.1 Черным по белому говорит что INFINITY поддерживается для NUMBER. (там же пишет что NaN не поддерживает, сорри Bfink) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2020, 21:21 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
Было немного времени, я соорудил все-таки механизм для [subj]. Проверил, работает. Надежно защищает от ошибок с null во время компиляции, а не исполнения. Выглядит это вот так, приходится делать fint() ушами на каждом параметре. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
Хотелось бы без финта, Оракла это запрещает на уровне концепций PL/SQL, поэтому это лучшее что есть или будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2020, 23:38 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
НеофитSQL xtender, > Positive and negative infinity ( generated only by importing from an Oracle Database, Version 5 ) Извините, я вовремя не прочитал что это невозможно, поэтому уже сделал в SQL+. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2020, 00:38 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
НеофитSQL fint ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2020, 00:42 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
мимо (там овраг), но вам туда можно ©С. Альтов ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2020, 00:45 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
xtender НеофитSQL fint Помню это решение. Оно запрещает передачу константы null. Но как-то сложно. Там достаточно параметр объявить SIMPLE_INTEGER, будет лучше и без мороки. К сожалению, такое простое решение обходится неинизиализированной переменной. Код: plsql 1. 2. 3.
Мое решение это не позволяет. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2020, 01:09 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
НеофитSQL Проверил, работает. Надежно защищает от ошибок с null во время компиляции, а не исполнения. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2020, 01:16 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
НеофитSQL Мое решение это не позволяет. Код: plsql 1. 2. 3. 4.
компилятор тоже не отловит ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2020, 01:18 |
|
Запретить передачу null параметра в PL/SQL procedure
|
|||
---|---|---|---|
#18+
Вообще-то в моем решении fint() это функция, но вы совершенно правы, там null поймается только в момент выполнения. Получается что я изучил создание объектов и методы подавления автоматических конструкторов совершенно напрасно :) С учетом последнего комментария, овчинка выделки не стоила. Нужно остановиться на параметре типа SIMPLE_INTEGER, и ждать пока кто-то напишет линт для выдачи предупреждений типа "обнуляемое выражение передалось в параметр, который не обнуляемый". ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2020, 01:50 |
|
|
start [/forum/topic.php?all=1&fid=52&tid=1880836]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
168ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
108ms |
get tp. blocked users: |
1ms |
others: | 300ms |
total: | 620ms |
0 / 0 |