powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Запретить передачу null параметра в PL/SQL procedure
14 сообщений из 114, страница 5 из 5
Запретить передачу 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♫                А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
14 сообщений из 114, страница 5 из 5
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Запретить передачу null параметра в PL/SQL procedure
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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