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

я написал PL/SQL функцию которая ожидает несколько чисел-параметров.
Код: plsql
1.
2.
3.
4.
function MyAdd( a in integer, b in integer ) return integer is
begin
  return a+b;
end;



Хочется запретить передачу null в качестве параметров на стадии компиляции.
В логике этой моей функции null никогда не полезен, и его появление всегда говорит об ошибке в программе, в моем случае.

Я могу сделать обработку в ран тайм с nvl(), или бросить Exception, но не знаю PL/SQL достаточно глубоко, чтобы объявить параметры функции "null не принимает". Мне неизвестно, возможно ли вообще такое, потому что:

Код: plsql
1.
2.
3.
4.
n integer;
begin
  n := null;
  x := MyAdd( n, n );



В этом примере можно обмануть компилятор.

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

Не умеет
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40001826
istrebitel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40001830
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неофит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.
SQL> create or replace package dropme_pck is
  2      subtype int_not_null is int not null;
  3  end;
  4  /

Package created.

SQL> create or replace procedure dropme_p(p_int dropme_pck.int_not_null)
  2  is
  3  begin
  4      dbms_output.put_line(p_int);
  5  end;
  6  /

Procedure created.

SQL> exec dropme_p(1);

1

PL/SQL procedure successfully completed.

SQL> exec dropme_p(null);
BEGIN dropme_p(null); END;

               *
ERROR at line 1:
ORA-06550: line 1, column 16:
PLS-00567: cannot pass NULL to a NOT NULL constrained formal parameter
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40001832
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40001836
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
env,


НеофитSQL
на стадии компиляции.
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40001839
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
НеофитSQL
В других языках есть конструкции позволяющие синтаксически запретить null в параметрах
"другие" языки тебе тоже стоит поучить нормально.
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40001840
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
динамически получаемые параметры на этапе компиляции еще неизвестны.
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40001845
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env,

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

xtender,

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

Посмотрите конструкцию C/C++ proc( const TYPE& x ), где параметр передается по ссылке, но сама ссылка нулем быть не может.
При этом функция прекрасно принимает константы типа, и можно писать proc( 5 ) хотя язык не определяет указатели на такие литералы.
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40001854
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость


В точку. Мои поиски не нашли эту тему, спасибо!
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40001896
oragraf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL,

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


...

Посмотрите конструкцию C/C++ proc( const TYPE& x ), где параметр передается по ссылке, но сама ссылка нулем быть не может.
При этом функция прекрасно принимает константы типа, и можно писать proc( 5 ) хотя язык не определяет указатели на такие литералы.


1) IN параметры в PL/SQL всегда pass by reference-to-const, то есть 100% точно
аналогичны C++ параметрам вида
Код: plaintext
1.
(const typename& paramname)

,
и ни при каких обстоятельствах не могут быть иными, by design.
Ясность и железобетонность работы IN параметра не только автоматически освобождает мозг от вопроса правильности
использования модификатора const, но и, при понимании того, что это именно и только
Код: plaintext
1.
(const typename& paramname)

, и никогда ничто иное, так же автоматически, дает все преимущества работы по ссылке.


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

...
дает все преимущества работы по ссылке.
...

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

...

здесь тоже, с оговоркой на то, что Simple_* типы самые быстрые by design.
И Not Null у них, похоже, чуть-чуть другой системы.
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40001925
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
booby
.
.
.
простыня
.
.


Другими словами, как сказали выше раньше и короче, в PL/SQL невозможно отказаться от null параметра даже там, где ожидается 2-байтное число. Придется с этим жить, у каждого языка свои сильные и слабые стороны. Пережил Итаниум, переживу и это.

автор4) Сравнивая PL/SQL с "другими языками", подразумевая это явно или нет, вы даете отсылки к таким "другим языкам",
которые являются языками программирования, но PL/SQL таковым не является.

Лол, хорошо. оставайтесь пока при этом мнении :) Когда-нибудь почитайте Кнута.

Станет скучно - попробуйте передать null в putchar( int c ), расскажите как получилось.
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40001926
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
... в PL/SQL нет понятия "неопределённое поведение".
...

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

... попробуйте передать null в putchar( int c ), расскажите как получилось.


Вы бы сняли клоунский колпак.
Шутки у вас плоские, если всё ещё считать, что вы "продолжаете шутить".
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40001928
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL

... 2-байтное число...

что это, ты что - пьёшь по ночам?
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40001929
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Неофит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.
$ cat constref.cpp && g++ -std=c++11 -w -o constref constref.cpp && ./constref 1
#include <iostream>

void proc(const int& a)
{
    std::cout <<"======\n" << a << " Yoohoo\n";
}

int main(int argc, char** argv)
{
    int x;
    proc(x);
    x = argc==2?NULL:333333;
    proc(x);
    proc(NULL);
    return 0;
}
======
0 Yoohoo
======
0 Yoohoo
======
0 Yoohoo



Ты вообще понимаешь разницу run-time/compile time?

зы. Вообще, это ж додуматься надо было именно С в таком контексте упомянуть...
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40001930
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Неофит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.
$ cat constref.cpp && g++ -std=c++11 -w -o constref constref.cpp && ./constref 1
#include <iostream>

void proc(const int& a)
{
    std::cout <<"======\n" << a << " Yoohoo\n";
}

int main(int argc, char** argv)
{
    putchar(NULL);
    proc(NULL);
    proc(3);
    return 0;
}
======
0 Yoohoo
======
3 Yoohoo



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

Форум немного не так работает то что "по прочтении сжечь" лучше отправлять на почту у меня в профиле :)
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40001940
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender
Не советуй того, что сам не осилил... Да и судя по тому, как ты осваиваешь документацию по ораклу, сомневаюсь, что осилишь.
Но бисер мечете…
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40001969
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender
Код: plaintext
1.
2.
3.
4.
5.
$ cat constref.cpp && g++ -std=c++11 -w -o constref constref.cpp && ./constref 1
#include <iostream>

    proc(x);
    proc(NULL);




Не совсем честное сравнение, Саян. Скорее всего в твоем компиляторе, даже несмотря на с++11, NULL определен как
Код: plaintext
1.
#define NULL 0

(либо идет замена на таковое на этапе компиляции), так что твой NULL имеет тот же тип int с нулевым значением.

Если ты же ты хотел туда передать нулевой указатель nullptr (по смыслу наиболее близкое значение к ораколовому null), то код не скомпилится из-за разности типов.
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40001980
Sah
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А мне интересно, что Саян пишет... Так что польза есть :)
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40001983
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad
...

Если ты же ты хотел туда передать нулевой указатель nullptr (по смыслу наиболее близкое значение к ораколовому null)...

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

Если ты же ты хотел туда передать нулевой указатель nullptr (по смыслу наиболее близкое значение к ораколовому null)...

Вы чё, белены объелись?
Расскажи, из какой ноздри таку бредятину доставать надо?
Если Вы не согласны с моим утверждением, то пожалуйста, опровергните его. Или попробуйте ответить на вопрос: какой способ передачи параметров в функцию в С/С++ (без учета наличия перегрузок) позволяет логически сделать параметр необязательным (непроинициализированным) и в вызываемой функции определить, был ли передан (проинициализирован) тот или иной параметр.
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002011
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad
booby
пропущено...

Вы чё, белены объелись?
Расскажи, из какой ноздри таку бредятину доставать надо?
Если Вы не согласны с моим утверждением, то пожалуйста, опровергните его. Или попробуйте ответить на вопрос: какой способ передачи параметров в функцию в С/С++ (без учета наличия перегрузок) позволяет логически сделать параметр необязательным (непроинициализированным) и в вызываемой функции определить, был ли передан (проинициализирован) тот или иной параметр.


Правильно ли я понял, что вы утверждаете буквально следующее:
При объявлении в разделе деклараций процедуры/функции/анонимного блока
переменной типа, например, pls_integer, на стеке выделяется память не под значение для этой переменной,
а всегда и обязательно под адрес к выделяемому в куче значению?
И значение Null в Pl/SQL всегда опознается по нулевому значению этого адреса?

Я, правда, не знаю, как оно на самом деле, расскажите.
Я свою белену закатаю в трубочку, если вы как-то сможете обосновать своё суждение.
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002024
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати, даже если на самом деле используется любая форма косвенности,
это означает лишь то, что что получение нуля в качестве адреса в параметре в PL/SQL невозможно в принципе.
Поэтому, и в таком случае тоже, аналогия с передачей nullptr в параметр в С++ - некорректна.
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002027
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby,
имхо в pl/sql есть признак на null
различает же он как-то null и '' пустую строку

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

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

Stax
null и '' пустую строку

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

Подумай хорошенько... Посмотри контекст обсуждения, внимательно посмотри мой пример и еще раз подумай...

Зы. Свои утверждения тоже хорошенько обдумай. Booby кое о чем уже намекал ещё до появления тебя в теме. Не вынуждай комментировать твои измышлизмы...

Зы2. Пассаж про "мой" компилятор мне понравился
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002049
Les
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неофит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;
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002052
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Stax
booby,
имхо в pl/sql есть признак на null
различает же он как-то null и '' пустую строку

.....
stax
ну сто раз же обсуждалось... и в доке есть...
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
declare
   procedure f(i in int) as
   begin dbms_output.put_line('int'); end;
   
   procedure f(i in varchar2) as
   begin dbms_output.put_line('chr'); end;
   
begin
   f(1);
   f('');
--   f(null);
end;
/


Код: plsql
1.
2.
3.
4.
int
chr

PL/SQL procedure successfully completed.


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
declare
   procedure f(i in int) as
   begin dbms_output.put_line('int'); end;
   
   procedure f(i in varchar2) as
   begin dbms_output.put_line('chr'); end;
   
begin
   f(1);
   f('');
   f(null);
end;
/


Код: plsql
1.
2.
3.
4.
5.
6.
7.
   f(null);
   *
ERROR at line 11:
ORA-06550: line 11, column 4:
PLS-00307: too many declarations of 'F' match this call
ORA-06550: line 11, column 4:
PL/SQL: Statement ignored

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

Правильно ли я понял, что вы утверждаете буквально следующее:
При объявлении в разделе деклараций процедуры/функции/анонимного блока
переменной типа, например, pls_integer, на стеке выделяется память не под значение для этой переменной,
а всегда и обязательно под адрес к выделяемому в куче значению?
В контексте моего утверждения вообще не имеет значения, как физически реализовано хранение переменных в памяти в Oracle. Строго говоря, поскольку я никогда не изучал исходники Oracle, я вообще не могу утверждать, что память под локальные переменные PL/SQL-функции или анонимного блока всегда выделяется на стеке машины, (то на что указывает регистр SP).

На контекст моего утверждение явно указывает мой вопрос, адресованный Вам. Ну, а смысл появления nullptr в c+11, как более безопасная альтернатива NULL, думаю Вам хорошо известен.

xtender
AmKad,

Подумай хорошенько... Посмотри контекст обсуждения, внимательно посмотри мой пример и еще раз подумай...
А что там думать, Саян? Ты передал честный int с нулевым значением в int-параметр функции. С таким же успехом можно было просто написать proc(0);. Что ты хотел показать?

xtender
Зы2. Пассаж про "мой" компилятор мне понравился
Когда в контексте С++ говорят "твой компилятор", то имеют в виду его конкретное название (или производителя), версию, платформу, под которую идет сборка, и настройки компиляции. И еще бывают неспецифицированные стандартом расширения.
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002060
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
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.
$ cat constref.cpp && g++ -std=c++11 -w -o constref constref.cpp && ./constref && ./constref && ./constref 
#include <iostream>

void proc(const int& a)
{
    std::cout <<"======\n" << a << " Yoohoo\n";
}

int main(int argc, char** argv)
{
    int x=0;
    int a=123;
    int y;
    int z;
    proc(++x);
    proc(++y);
    proc(++z);
    return 0;
}
======
1 Yoohoo
======
32765 Yoohoo
======
1742994097 Yoohoo

======
1 Yoohoo
======
32766 Yoohoo
======
-524876047 Yoohoo

======
1 Yoohoo
======
32767 Yoohoo
======
1917494433 Yoohoo

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


В эксепшн автор и сам уже умеет )
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002077
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
$ cat constref.cpp && g++ -std=c++11 -w -o constref constref.cpp && ./constref && ./constref && ./constref 
#include <iostream>

void proc(const int& a)
{
    std::cout <<"======\n" << a << " Yoohoo\n";
}

int main(int argc, char** argv)
{
    int x=0;
    int a=123;
    int y;
    int z;
    proc(++x);
    proc(++y);
    proc(++z);
    return 0;
}
======
1 Yoohoo
======
32765 Yoohoo
======
1742994097 Yoohoo

======
1 Yoohoo
======
32766 Yoohoo
======
-524876047 Yoohoo

======
1 Yoohoo
======
32767 Yoohoo
======
1917494433 Yoohoo

Саян, я правда тебя не понимаю. Что ты хочешь показать? Что непроинициализированные локальные переменные имеют "случайные" значения (по факту инициализируются текущими значениями в стеке)? Или что на машинном уровне передача по ссылке реализована как передача по указателю? Если я настолько глуп, не соизволишь ли ты объяснить мне на понятном языке?
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002081
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xtender
Ты вообще понимаешь разницу run-time/compile time?

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

О том, что booby написал ещё в самом начале: про сишные UB куда ни плюнь...сравни сишный "int x;" и pl/sql "x int;"

Уж что-что, а си и даже современные плюсы сюда в контекст пихать мягко говоря не стоило...
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002096
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
graycode
xtender
Ты вообще понимаешь разницу run-time/compile time?

С большой долей вероятности автор топика имел ввиду примитивные типы данных в некоторых распространенных языках программирования, которые действительно не могут быть null и соответствие типов проверяется в большинстве случаев при компиляции.
потому ссылка на документацию и была... Надо хотя бы знать основы, да хотя посмотреть в sys.standard...

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

AmKad
...

На контекст моего утверждение явно указывает мой вопрос, адресованный Вам.

Вы задали мне такой вопрос:
AmKad..попробуйте ответить на вопрос: какой способ передачи параметров в функцию в С/С++ (без учета наличия перегрузок) позволяет логически сделать параметр необязательным (непроинициализированным) и в вызываемой функции определить, был ли передан (проинициализирован) тот или иной параметр

Ответа на него я не знаю , в частности потому, что вообще отношения ни C, ни С++ не имею.
Технически, "в стиле C/C++", на уровне подсистемы передачи параметров, это можно было бы делать передачей как раз nullptr для пропущенного параметра, изолированного в промежуточную ссылочную переменную.
Однако Вы, задавая такой такой вопрос, вероятно не просто знаете на него правильный ответ,
но и понимаете, как он обосновывает утверждение о том, что nullptr "по смыслу наиболее близкое значение к ораколовому null".

Что точно вы вы хотели сказать своим ответом в виде вопроса, если перевести его в утвердительное предложение?



AmKad
...
... Ну, а смысл появления nullptr в c+11, как более безопасная альтернатива NULL, думаю Вам хорошо известен.

В контексте данного конкретного топика это выглядит вообще как весёлая шутка:
Т.е., перевожу:
С++ развивается от C в направлении к Ada, в смысле непрерывного укрепления строгости системы типов,
а PL/SQL с рождения продрейфовал от Ada к "процедурным расширениям SQL", сразу и явно пожертвовав строгостью системы типов,
путём внедрения встроенного преобразования типов для значений.

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

О том, что booby написал ещё в самом начале: про сишные UB куда ни плюнь...сравни сишный
Демонстрация UB через передачу NULL в int-овый параметр - это неудачный пример. Ввиду того, что NULL это и есть int, то есть фактически конкретное пронициализированное значение.

И проблему неинициализированных переменных нельзя назвать чисто сишной. Хотя, уверен, твой 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.
#include <iostream>

class A {
public:
    A(int X, int Y) : x(X), y(Y) { }
    ~A() {x = -1; y = -1;}
    void Out() const {
        std::cout << "X=" << x << " Y=" << y << std::endl;
    };
private:
int x, y;
};

void OutA(const A& aObj){
    aObj.Out();
}

int main()
{   
    auto p = new A(11, 100);
    OutA(*p);
    delete p;
    OutA(*p); // UB
    return 0;
}


X=11 Y=100                                                                                                                                                                         
X=0 Y=0                                                                                                                                                                            
                                                                                                                                                                                  
                                                                                                                                                                                   
...Program finished with exit code 0                                                                                                                                               

https://onlinegdb.com/S1_gHx5BP
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002126
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
AmKad,

Про NULL в первом примере было вообще о понимании разницы null в pl/sql и в сях и с намёком про c++11
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002127
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby

Ответа на него я не знаю , в частности потому, что вообще отношения ни C, ни С++ не имею.
Ответ простой: передача посредством указателя. Если указатель нулевой, то параметр не передан.
Дополнение: в С+11 появился более безопасный способ указать нулевой указатель: nullptr.
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002174
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad,

И как это должно быть связано с утверждением об эквивалентности нулевого указателя и Null,
с учетом того (если я правильно понял ваши отговорки), что вы уже не готовы утверждать,
что по адресу, ассоциированному с переменной лежит не значение, а ссылка на него.

Кстати, это правда мог бы быть простой вариант реализации за малую цену общей производительности.
Но даже, если это на самом деле так, и Вы абсолютно правы в своем "почти приравнивании" nullptr в C++ и Null в pl/sql,
а белены объелся именно я, это не отменяет того, что в логическом отношении PL/SQL-Null - это самостоятельное значение.

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

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

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

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

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

В оракле в случае переменных простых типов null - это спец значение 0xFF.


А вот тут неясно что под капотом. Кто знает может как в OCI - indicator variable в придачу.

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

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

Вы пишите примерно так: "вызывающий видит, и потому может..."
В этом примере вызывающий (а здесь вызывающим является сам компилируемый блок кода) тоже всё "видит",
и если не "может", надо бы определить - почему.

То, что написали Вы, можно было бы интерпретировать так: - атрибут для Not Null у типа всегда есть,
он может быть заполненным или нет, но обратиться и проверить его можно всегда.
Значит, к объявлению любой переменной можно дописать Not Null, и для неё может быть использована ссылка на
копию описателя базового типа, но с заполненным атрибутом.
-----------
Иным способом это можно было бы представить так - увидев объявление n Number Not Null Default 0,
компилятор расширяет раздел деклараций и, скрытым образом дописывает в него определение типа локальной области видимости.

И я подразумевал точно это.
Параметр с точки зрения использующего кода внутри процедуры в этом отношении неотличим от локальной переменной,
он и есть - локальная переменная в области видимости процедуры.
(И в этом смысле было бы хорошо, если бы доступный для описания его ограничений типа синтаксис,
был доступен и для любых других переменных локальной области видимости,
тогда предложенный вариант кода тоже окажется компилируемым)

Но, в отличие от прочих переменных локальной области, у параметра есть внешние обязательства,
нельзя обойтись скрытым расширением области объявлений - тип параметра должен быть известен и правильно использован,
даже в случае, когда система не резервирует атрибут Nullable/Not Nullable, а использует его по необходимости
...
Далее мне можно было бы слово в слово повторить предыдущий свой пост, но я разрешу себе этого не делать, sorry.
...
Вообще, такого рода тему, можно было обсуждать и в терминах "автоматически выводимых типов",
но я скептически на это смотрю - одно дело заменять "недостаточно точно типизированные" значения на "более точно" типизированные,
это то, что я назвал "движением от C к Ada".
Совсем другое дело, когда говорят - точный тип вам указывать не надо, компилятор умный и сам его выведет.
Это дорога от "C в ад".
Ну, в самом удачном случае, если всё-таки нужно как-то сохранять работоспособность кода - "от C к Basic-у".
Только "производительность" тогда становится левым вопросом.
вот примерно так я сейчас думаю.
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002711
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY,

Кстати, в контексте упоминания Domain Names и прочих охов.
Вообще говоря, на 99.99% было бы достаточно, если бы объявление сорта
n table.field%type;
Наследовало бы и Not Null от поля таблицы.

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

Именно к этому было и упоминание о Domain Names - новый логический конструкт позволил бы исправить старые ошибки.
А без него - не больно-то и сделаешь.
Кто возьмет на себя костюм супергероя?
Там дедушки в компании. Хитрые, умные и осторожные...
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40002717
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помечтаю:

Код: plsql
1.
function abs( n int not null ) return int not null;



Где "int not null" - новый скалярный тип, которому нельзя присвоить null, а также переменную которая может принимать значение null. Проверка компиляции.

Код: plsql
1.
2.
3.
4.
5.
n int not null := 3;
k int := 6;
...
k := n; -- так можно
n := k; -- нельзя, неявный каст в nullable запрещен во время компиляции



Все литералы будут иметь тип not null, поэтому присвоение констант не изменится. Преобразование переменных nullable в not null будет только в явном виде, через nvx (), где второй параметр not null.

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

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


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

Код: plsql
1.
2.
3.
4.
5.
6.
7.
create or replace
  procedure p1(p_par date)
    is
    begin
        null;
end;
/



При компиляции

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
create or replace
  procedure p2
    is
        v_param varchar2(10);
    begin
        p_1(v_param);
end;
/



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

извините, я не могу это правильно прочитать.
У меня чепуха какая-то получается...

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

Добавление not null в таком случае должно считаться изменением сигнатуры и инвалидировать все зависимости?
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40003513
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На выходных почитал SYS.STANDARD, пока мое решение для [subj] выглядит так:

Код: plsql
1.
2.
-- функция меняет знак целого параметра, пытается защититься от передачи null
function Neg( n in simple_integer ) return simple_integer deterministic;



Это похоже на уже предложенные идеи в начале темы, используя уже существующий для этих целей тип.
Эффект: передача константы null ловится во время компиляции. передача переменной или выражения в 11.2 ловится только во время исполнения, но с внятным обозначением проблемы в строке вызывающего кода (что для меня важно, если кто-то передает в мой API неверные параметры, предпочтительно чтобы ошибка была очевидной, без необходимости лезть в мой код или в документацию)

Можно сказать, проблема на 80% решена.

Что я еще пробовал: определить новый скалярный тип (а не субтип) используя служебное слово "new".
Идея в том, что подтипы и типы взаимозаменяемы на стадии компиляции, а мне нужно запретить неявный каст integer->simple_integer.
Оракл ругается, что оператор "new" в определениях типе зарезервировал для системы, и юзерам это не дано.

Когда будет время, я собираюсь посмотреть можно ли неявный каст запретить через тип-объект, чтобы осуществить следующее:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
-- функция меняет знак целого параметра, пытается защититься от передачи null
function Neg( n in safe_int ) return safe_int deterministic;
n integer;
...
  ..Neg( n ); -- ошибка компиляции, отсутствует неявный каст integer->safe_int
  ..Neg( 5 ); -- работает, есть неявный каст или конструктор из simple_integer->safe_int (оракл в доках обещает что литералы обладают атрибутом "not null")
  ..8 +Neg( 5 ); -- работает, есть неявный каст safe_int->simple_integer



пока я вижу что Оракл автоматически создает конструкторы для кастов в тип объекта, и их невозможно скрыть объявлением private, т.к. этот элемент языка отсутствует. Но нашел пару других механизмов, которые прячут конструкторы.
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40003537
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env
SY
при компиляции дополнительно проверить

Добавление not null в таком случае должно считаться изменением сигнатуры и инвалидировать все зависимости?


Это так. У процедур f( n in natural ) и f( n in naturalN ) разные сигнатуры.
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40004870
Bfink
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подкину свои пять копеек -
Можно передавать NULL в параметре, а можно пропустить этот параметр.
Это эквивалентные действия? Или нужны две проверки?
И как быть если процедура головная и вызывается прямо из OCI?
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40004895
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Bfink,

Задача изначально была запретить возможность передачи null на уровне компиляции в функции с простыми скалярными' параметрами.

ТС (я) надеялся что наличие такого механизма позволит объявить функции "скалярными' и избавит от нудной но необходимой проверки на null в блоке валидации параметров функций.

С тех пор я увидел что простого механизма это сделать не существует, а также вполне привык ожидать null в любом выражении. Температура среды? null. Вес объекта? null. Количество памяти отведенное под объект? null.
Идентификатор типа переменной number которой присвоили null? Null, т.к. это ещё и тип. (Поймался разок при декапсуляции в DCOM).
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40004901
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bfink
Подкину свои пять копеек -
Можно передавать NULL в параметре, а можно пропустить этот параметр.
Это эквивалентные действия? Или нужны две проверки?
И как быть если процедура головная и вызывается прямо из OCI?


Передать NULL означает передать значение actual параметра явно. Опустить параметр означает проверку а задан ли DEFAULT для formal параметра который и становится значением actual параметра. А ситуация

Код: plsql
1.
some_param ... DEFAULT NULL NOT NULL


отсечется еще при компиляции. A в OCI проверки думаю при OCIStmtPrepare.

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


Я бы еще добавил - манипуляция со строками, например, trim и опа - NULL !
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40004908
Bfink
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY,

если нет default, то можно отличить фактический параметр NULL от пропущенного параметра внутри процедуры?
OCI подкидывает прикольные вещи, например, я не умею породить NAN в binary_float внутри PLSQL, а OCI легко делает это на входе.
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40004913
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bfink
SY,

если нет default, то можно отличить фактический параметр NULL от пропущенного параметра внутри процедуры?
OCI подкидывает прикольные вещи, например, я не умею породить NAN в binary_float внутри PLSQL, а OCI легко делает это на входе.


А что тут отличать? Если Oracle осуществляет проверки перед вызовом то тупо смотрим есть ли у formal параметрa default. Если Oracle осуществляет проверки вызываемом коде то скорее всего передается флаг опущен данный actual параметр или нет.

SY.
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40004922
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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');
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40004959
Bfink
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Породить float/NAN возможно


А в NUMBER, который тип колонки в таблице?

infinity можно.
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40004967
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bfink
А в NUMBER, который тип колонки в таблице?

infinity можно.

Видел NaN в Oracle'вой табличке (нужно было базу в PostgreSQL перегнать). Очень мучался. JDBC падало.
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40004968
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,

Так вот же виновник !

з.ы. Example порадовал, видимо есть и запись с обратным условием
Код: plsql
1.
SELECT last_name FROM employees WHERE salary IS NOT INFINITE;
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40004972
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
env
з.ы. Example порадовал, видимо есть и запись с обратным условием
сначала налоги с такой зарплаты заплати NULL или NaN и то получше будут - хоть в тюрьму не посадят
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40004994
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Bfink
НеофитSQL
Породить float/NAN возможно


А в NUMBER, который тип колонки в таблице?

infinity можно.


внутренний формат NUMBER позволяет хранить особые значения, но посмотрев на код Оракла я сомневаюсь что NaN поддерживается для этого типа, по крайней мере в PL/SQL.

Почему я так считаю:
- в STANDARD не определена константа для NUMBER_NAN как она определена для нескольких других типов.
- имплементация стандартной функции NANVL(NUMBER,NUMBER) не учитывает такой возможности, просто возвращает первый параметр.
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40004999
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я, кстати, не знал, что NUMBER позволяет хранить infinity. Только что поигрался с этим, обнаружил следующее:

В PL/SQL присутствует полная поддержка для десятичной бесконечности, кроме определения NUMBER_INFINITY.
Есть положительная и отрицательная бесконечности, определена функция "is infinite" для типа NUMBER, арифметика работает как ожидается, вычислительные функции тоже. Косинус от нее равен одному. Это говорит об отсутствии NaN/NUMBER, т.к. косинус от двоичной бесконечности это NaN.

В PL/SQL ее можно кастить в BINARY_FLOAT и обратно, все отрабатывается корректно. Преобразование в строку работает, хотя вместо 'Inf' оно печатает совсем другое.

В SQL с этой величиной печально, даже чтобы ее создать пришлось извернуться. SQL строго ловит арифметические переполнения и не разрешает касты от 1/0f. Когда получилось ее создать, все операции вылетают по ошибке, даже "is infinite" (иронично!).
SQL явно не любит эту величину, а вот с бинарными бесконечностями работает нормально.

А как вы столкнулись с десятичной бесконечностью в таблице? Пришла через импорт?
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40005007
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Неофит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:

  • Positive numbers in the range 1 x 10-130 to 9.99...9 x 10125 with up to 38 significant digits
  • Negative numbers from -1 x 10-130 to 9.99...99 x 10125 with up to 38 significant digits
  • Zero
  • Positive and negative infinity (generated only by importing from an Oracle Database, Version 5)
11.2 официальная поддержка исчезла, но в Format models по-прежнему осторожно сказано про ~ и -~:
автор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 (-~).
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40005009
Bfink
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL,

Бесконечность получить просто, в колонку NUMBER нужно инсертить 1/0b или -1/0b для отрицательной бесконечности.
А вот NaN так вставить не удалось. Зато OCI это делает легко - вставляешь строку в числовой параметр и в таблице очень плохое значение. Оно почему то больше нуля и его можно выделить на равенство. Особенно прикольно делать по этой колонке группировку.
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40005011
Bfink
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40005017
Неофит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.
SQL> select * from aa;

COL_INTEGER COL_BINARY_DOUBLE COL_BINARY_FLOAT COL_NUMBER
----------- ----------------- ---------------- ----------
          ~               Inf             -Inf         -~
                          Inf              Inf

SQL>
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40005018
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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.
SQL> select * from aa where col_integer > col_binary_double; -- левая колонка - десятичное число чуть больше бесконечности

COL_INTEGER COL_BINARY_DOUBLE COL_BINARY_FLOAT COL_NUMBER
----------- ----------------- ---------------- ----------
                          Inf             -Inf         -~
SQL> select nanvl(col_integer,5) from aa where col_integer > col_binary_double; -- nanvl() его не видит

NANVL(COL_INTEGER,5)
--------------------

SQL> select to_char(col_integer) from aa where col_integer > col_binary_double; -- печатает чушь из буфера

TO_CHAR(COL_INTEGER)
----------------------------------------
   рDQ5&#9835;                АLOE
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40005019
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
НеофитSQL,

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

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

Не "невозможно", а не поддерживается. Со всеми вытекающими...


К сожалению, документация Оракла - как та библия. Что захочешь, то и найдешь.

https://docs.oracle.com/database/121/DRDAS/data_type.htm#DRDAS2

Вроде относится к 12.1 Черным по белому говорит что INFINITY поддерживается для NUMBER.

(там же пишет что NaN не поддерживает, сорри Bfink)
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40005038
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Было немного времени, я соорудил все-таки механизм для [subj].

Проверил, работает. Надежно защищает от ошибок с null во время компиляции, а не исполнения.

Выглядит это вот так, приходится делать fint() ушами на каждом параметре.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
SQL> select NeverNull( fint(3) ) from dual;

NEVERNULL(FINT(3))
------------------
                 3

SQL> select NeverNull(null) from dual;
select NeverNull(null) from dual
       *
ERROR at line 1:
ORA-06553: PLS-567: cannot pass NULL to a NOT NULL constrained formal parameter


SQL> select NeverNull(fint(null)) from dual;
select NeverNull(fint(null)) from dual
                 *
ERROR at line 1:
ORA-06553: PLS-307: too many declarations of 'FINT' match this call



Хотелось бы без финта, Оракла это запрещает на уровне концепций PL/SQL, поэтому это лучшее что есть или будет.
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40005047
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Неофит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.
SQL> select * from aa;

COL_INTEGER COL_BINARY_DOUBLE COL_BINARY_FLOAT COL_NUMBER
----------- ----------------- ---------------- ----------
          ~               Inf             -Inf         -~
                          Inf              Inf

SQL>

чти еще раз: 21148756
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40005048
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
НеофитSQL
fint
да прямо изобретатель... 22203366
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40005049
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
мимо (там овраг), но вам туда можно ©С. Альтов
...
Рейтинг: 0 / 0
Запретить передачу null параметра в PL/SQL procedure
    #40005055
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xtender
НеофитSQL
fint
да прямо изобретатель... 22203366


Помню это решение. Оно запрещает передачу константы null. Но как-то сложно.
Там достаточно параметр объявить SIMPLE_INTEGER, будет лучше и без мороки.

К сожалению, такое простое решение обходится неинизиализированной переменной.

Код: plsql
1.
2.
3.
n integer;
...
proc( n ); -- компилятор тут не ловит



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


Код: plsql
1.
2.
3.
4.
n int;
x fint;
...
x:=fint(n);


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

Получается что я изучил создание объектов и методы подавления автоматических конструкторов совершенно напрасно :)


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


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