|
Запретить передачу 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 |
|
|
start [/forum/topic.php?fid=52&msg=40001928&tid=1880836]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
154ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
others: | 306ms |
total: | 567ms |
0 / 0 |