|
Запретить передачу 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 |
|
|
start [/forum/topic.php?fid=52&msg=40002211&tid=1880836]: |
0ms |
get settings: |
11ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
34ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
others: | 331ms |
total: | 465ms |
0 / 0 |