powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Запретить передачу null параметра в PL/SQL procedure
25 сообщений из 114, страница 3 из 5
Запретить передачу null параметра в PL/SQL procedure
    #40002201
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
всегда инициализированы

ок, аккуратнее так сказать - всегда инициализированы, по крайней мере, частично.
(в предположении множественных несовпадающих реализаций спецификации языка).
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002204
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
booby
xtender
booby,

...Объекты же как и коллекции в pl/sql тоже могут быть неинициализированными

если подразумевается, имеющими значение 0xFF, то в русском языке это называется - всегда инициализированы
"тоже" имелось в виду как в плюсах, а не как ординарные типы
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002205
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Точнее даже "почти как в плюсах", тк объектные переменные тоже могут быть null в pl/sql, т.е. сам объект не создаётся по умолчанию
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002208
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY
В любом случае - возможность указать NOT NULL для IN/IN OUT параметров (runtime проверка естественно) было бы неплохо хотя и явная поверка в теле stored objects не смертельно.

SY.


насколько я понимаю, при передаче фактического параметра, Not Null на нем проверяется именно подсистемой передачи параметров.

И это не так, когда передается фактическое значение в ограниченный на размер/диапазон тип формального параметра,
размер для подтипов Number/Varchar2 точно не проверяется, диапазоны на самом деле, не проверял.

Вообще, конечно, с системой типов бывает досада - тут строгие, тут расслабили, а там вообще рыбу завернули.
not Null явно на параметре определенный, должен быть эквивалентен локальному объявлению подтипа.
В общем, мне с разбегу не видно, почему это плохо и не надо давать такой возможности.
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002211
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby,

хотя, наверно, это усложнение компилятора - если это функция глобальной области видимости - где-то должны появиться глобально видимые определения типов.
Для пакетов не критично, а для самостоятельных процедур/функций - куда их девать -
вроде скрытый пакет в схеме, потенциально сильно связывающий оставшийся код, тогда должен появляться.
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002235
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby

хотя, наверно, это усложнение компилятора - если это функция глобальной области видимости - где-то должны появиться глобально видимые определения типов.


Вызывающий код уже делает все проверки и знает тип как formal так и actual параметров так-что добавить атрибут NULL/NOT NULL к formal параметру и проверять actual на NULL если formal NOT NULL несложно.

SY.
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002248
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY,
для дого, чтобы оно работало в рантайме, формальный тип должен быть известен на этапе компиляции.

твое предложение сводится, по сути, к тому, что определение типа формального параметра должно сидеть
прямо в спецификации вызываемой процедуры, это как минимум, другая процедура привязки.

Либо, то, что говорил я - определение типа в момент компиляции динамически складывается/добавляется в какое-то "общее место",
это, может быть, дополнительный проход на этапе компиляции.

Первое, вероятно, не в ладах будет с совместимостью со старыми клиентами, второе само по себе будет плохо работать
в условиях наличия большого объема разнообразного по назначению кода в схеме.
Хотя "в принципе", сделать могли бы.
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002249
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY
В любом случае - возможность указать NOT NULL для IN/IN OUT параметров (runtime проверка естественно) было бы неплохо хотя и явная поверка в теле stored objects не смертельно.
SY.


Это было бы хорошо, иначе приходится в теле сразу или проверять или обнулять через nvl.

Я вижу тут бурные дебаты пошли во все стороны, поэтому сужу вопрос только для простых скалярных встроенных типов.
Выглядит недоработкой что поля типа INTEGER в таблице можно объявить как НЕ-nullable, а параметры в функции - нельзя.
Возможно, это однажды было великой концепцией что даже один байт всегда передается по ссылке и следовательно, может отсутствовать, и возможно, SQL стандарт когда-нибудь предложит альтернативу для встроенных типов.

PL/SQL часто помогает сгладить этот угол. Например, следующее присваивание обрабатывает null не вызывая исключение:

Код: plsql
1.
2.
3.
4.
n integer;
n := null;

dbms_output.put_line( 'Переданное целое число: (' || n ||')' ); -- печатает пустое место, но хоть не вылетает



А дальше уже хуже, т.к для null PL/SQL не соблюдает правила булевой алгебры, а некоторые операции с ним запрещены:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
  
if n not in (1,2,3) then dbms_output.put_line( 'n вышло за границы' );
else 
  for i in 1..n -- вылетает по runtime
  loop
     dbms_output.put_line( 'строка #'|| i );
  end loop;
end if;



Попытки передать null в putchar() закончились предсказуемым неуспехом (передался int 0, что не то же самое), хотя не всем еще понятно почему.

Ответ: при передаче по параметра по значению невозможно передать null на значение, только само значение.
Если функция просит один байт, в C++ ей придется скормить ровно один байт, не больше, не меньше (в C немного по другому).

Пример с (const TYPE& val) передает по ссылке, но тоже запрещает передать null, что используют программисты в C/C++.
Когда возможность передать null приветствуется, используются указатели (TYPE* pval).
Синтакс работы с указателями и ссылками отличается в C/C++, напоминая программистам о возможности присутствия null.

Например, битовое копирование в первом случае всегда безопасно, т.к.синтакс гарантирует наличие объекта
Код: plaintext
1.
 memcpy( buf, &val, sizeof(val) ); // всегда безопасно, если buf доступен на запись



битовое копирование во втором случае использует указатель, что подсказывает программисту что можно нарваться на NULL:
Код: plaintext
1.
 memcpy( buf, pval, sizeof(*pval) ); // может рвануть из-за второго параметра, третий не проблема.
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002264
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender
AmKad,

Про NULL в первом примере было вообще о понимании разницы null в pl/sql и в сях и с намёком про c++11
Без указания c++11, то есть на более старом стандарте языка (или даже на более новом - без разницы), твой первый пример отработает точно так же.
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002265
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
НеофитSQL,

Этот идиотизм уже утомил. Даже комментировать этот бред не буду. Иди учи плюсы в соответствующую ветку форума. Ещё один такой поток бреда и будет бан за офтоп.
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002268
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
AmKad,

Намёк был про определение NULL. Идите обсуждайте такое с Неофитом в соответствующем форуме
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002269
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender,

Хорошо. Прекращаю оффтоп. Но, заметь, про C++ первым пример дал ты, а твои намеки так и остались непонятыми.
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002272
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
НеофитSQL

PL/SQL часто помогает сгладить этот угол. Например, следующее присваивание обрабатывает null не вызывая исключение:

Код: plsql
1.
2.
3.
4.
n integer;
n := null;

dbms_output.put_line( 'Переданное целое число: (' || n ||')' ); -- печатает пустое место, но хоть не вылетает




Мой комплимент был преждевременным. Оракл обещает что когда захочет, это поведение сломает.

Оракл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,'')
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002283
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
НеофитSQL
НеофитSQL

PL/SQL часто помогает сгладить этот угол. Например, следующее присваивание обрабатывает null не вызывая исключение:

Код: plsql
1.
2.
3.
4.
n integer;
n := null;

dbms_output.put_line( 'Переданное целое число: (' || n ||')' ); -- печатает пустое место, но хоть не вылетает




Мой комплимент был преждевременным. Оракл обещает что когда захочет, это поведение сломает.

Оракл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,'')
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002286
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL,

А в каких языках есть проверка входных параметров на NULL?

упд. И как определён NULL в этих языках?
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002293
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL,
угол, сломает, обещает
Такое впечатление, что вы в степях росли.
это не угол, а бинарная операция.

Ломать есть всегда два варианта:
Либо так, что вообще никакой предшествующий код не будет совместим со следующей усорвершенствованной версией,
тут и беды нет - просто все сядут писать прикладной код заново, и будут заняты на следующие 40 лет.

Либо будет введена новая бинарная операция, которая будет давать Null в результате конкатенации не пустой строки с Null-строкой.
В этом ни беды, ни смысла нет. Жаль только, что переписывать ничего не надо будет.

автордля null PL/SQL не соблюдает правила булевой алгебры
соблюдает . только она не на двоичной логике построена, а на троичной,
с оговоркой на то, что третьим логическим значением выступает именно Null,
что формально не очень честно, но на практике еще никого не напрягло ни разу.

Про параметры - используйте объявления подтипов с not null.
В своем коде вы всегда найдете , где их разместить,
и почти всегда в прикладных задачах вы не сможете измерить оверхед от такого объявления,
так как в 100% (по вероятности) случаев критичным является sql.
если ваш pl/sql код нестоек к Null, просто защищайте его от Null снаружи, при обращении из sql.
снаружи, кроме nvl есть case, decode, coalesce

вот и все страдания.
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002308
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2S.Y.
по части not null параметров и определений полей в БД:

говорят, что стоимостной оптимизатор в Oracle Database появился после
покупки в 1994 году у DEC Rdb Database - вроде как взяли и перенесли
к себе из неё чуть ли ни без изменения кода, хотя это и неважно.

Так это или нет - не знаю, но я всегда не понимал, что помешало
так же целиком перенести к себе из неё и идею Domain Names.

Как по мне, так красота была бы неописуемая.

Единственная причина, которую я для себя придумал, могла быть такой:
Типа, это слабая идея, а мы вот щаз как выпустим объектные расширения, так нам сразу никакие Domain names
никогда и не понадобятся.

Если вправду, что-то на это похожее, то такие мысли я бы за техническую ошибку считал.
В том смысле, что и объектные расширения поверх Domain Names, или прямо как их расширения, тоже гораздо веселее
смотрелись бы, имхо.
Сказка была бы, а не СУБД.
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002317
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env
НеофитSQL,

А в каких языках есть проверка входных параметров на NULL?

упд. И как определён NULL в этих языках?


Модератор попросил не обсуждать C/C++ в этой теме, я (или друге эксперты по C/C++) могу ответить на профильном форуме.
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002333
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
booby

автордля null PL/SQL не соблюдает правила булевой алгебры

соблюдает . только она не на двоичной логике построена, а на троичной,
с оговоркой на то, что третьим логическим значением выступает именно Null,
что формально не очень честно, но на практике еще никого не напрягло ни разу.


Я не встречался раньше в программировании с 3VL алгеброй, ну а почему бы и нет?
Написал процедурку распечатать значения "булевой" переменной, и поигрался немного.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
  procedure PrintBool( b in boolean ) is
  begin
    if b is null then dbms_output.put_line( 'null' );
    elsif b      then dbms_output.put_line( 'True' );
    elsif not b  then dbms_output.put_line( 'False' );
    else              dbms_output.put_line( '????' ); end if;
  end PrintBool;



Четвертого состояния материи булевой переменной пока не нашел, уже хорошо.

Прошелся по таблице операций - вроде все совпадает как должно быть в 3VL по Клину.
Проверил ленивое вычисление (в PL/SQL, где оно есть), выражения с null уважают ленивость, все как положено.

Насколько я вижу, логические операции в PL/SQL следуют логике Клина, т.е. без противоречий.
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002340
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL,

иди лучше в мсскл
попробуй там, например, добавить новый параметр в функцию, не трогая старые вызова

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
alter function aaa(@param int = null)
returns integer
as
begin
    return 1;
end;

select dbo.aaa(default)

...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002353
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andreymx
НеофитSQL,

иди лучше в мсскл
попробуй там, например, добавить новый параметр в функцию, не трогая старые вызова

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
alter function aaa(@param int = null)
returns integer
as
begin
    return 1;
end;

select dbo.aaa(default)



Я не уловил разницу. В PL/SQL я могу добавить параметр с атрибутом default, чтобы не трогать старый код.
Перекомпилить, конечно же, придется.

Смысл в том, что в mssql старый код сможет вызвать обновленную функцию без перекомпиляции? так?
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002645
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
SQL> create or replace
  2    procedure p1(p_par date)
  3      is
  4      begin
  5          null;
  6  end;
  7  /

Procedure created.

SQL> exec p1(1);
BEGIN p1(1); END;

      *
ERROR at line 1:
ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'P1'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored


SQL>



Тут есть два варианта:

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.
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002648
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY,

а вот такой код после усовершенствования должен остаться нерабочим,
или скомпилироваться и правильно отработать?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
Declare 

  n Number not Null := 0;
Begin
  n := n + 1;
End;
/



...
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002669
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я попробовал следующий код, который выдал бы ошибку в в языке с более строгой проверкой типов.
Для разнообразия вместо null использовал другое ограничение.

Оракл скомпилировал перекаст на подтип не смущаясь, и поймал несоответствие во время исполнения.

Код: plsql
1.
2.
3.
4.
5.
6.
Declare 
  subtype unsigned is BINARY_INTEGER range 0 .. 10000;
  n unsigned := 0;
Begin
  n := -1;
End;
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002670
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
SY,

а вот такой код после усовершенствования должен остаться нерабочим,
или скомпилироваться и правильно отработать?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
Declare 

  n Number not Null := 0;
Begin
  n := n + 1;
End;
/



...


Ничего не понял. Это-же anonymous block - какие тут параметры?

SY.
...
Рейтинг: 0 / 0
25 сообщений из 114, страница 3 из 5
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Запретить передачу null параметра в PL/SQL procedure
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]