powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / BOOLEAN NOT NULL
7 сообщений из 7, страница 1 из 1
BOOLEAN NOT NULL
    #39605167
BOOLEAN NOT NULL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть код
Код: 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.
CREATE OR REPLACE PACKAGE PKG IS

  SUBTYPE BOOLEAN_NOT_NULL IS BOOLEAN NOT NULL;

  PROCEDURE ASSERT(CONDITION_IN IN BOOLEAN);

  PROCEDURE ASSERT_NN(CONDITION_IN IN PKG.BOOLEAN_NOT_NULL);

END PKG;

CREATE OR REPLACE PACKAGE BODY PKG IS

  PROCEDURE ASSERT(CONDITION_IN IN BOOLEAN) IS
  BEGIN
    IF CONDITION_IN THEN
      RETURN;
    ELSIF NOT CONDITION_IN THEN
      RAISE_APPLICATION_ERROR(-20001, 'FAILED');
    ELSE
      RAISE_APPLICATION_ERROR(-20002, 'UNKNOWN');
    END IF;
  END ASSERT;

  PROCEDURE ASSERT_NN(CONDITION_IN IN PKG.BOOLEAN_NOT_NULL) IS
  BEGIN
    IF CONDITION_IN THEN
      RETURN;
    ELSIF NOT CONDITION_IN THEN
      RAISE_APPLICATION_ERROR(-20001, 'FAILED');
    ELSE
      RAISE_APPLICATION_ERROR(-20002, 'UNKNOWN');
    END IF;
  END ASSERT_NN;

END PKG;



Запускаем тесты
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
EXEC PKG.ASSERT(1=1);
EXEC PKG.ASSERT(1=2);
EXEC PKG.ASSERT(NULL IS NULL);
EXEC PKG.ASSERT(NULL=1);
EXEC PKG.ASSERT(NULL);

EXEC PKG.ASSERT_NN(1=1);
EXEC PKG.ASSERT_NN(1=2);
EXEC PKG.ASSERT_NN(NULL IS NULL);
EXEC PKG.ASSERT_NN(NULL=1);
EXEC PKG.ASSERT_NN(NULL);



Результаты
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
PL/SQL procedure successfully completed.
ORA-20001: FAILED
PL/SQL procedure successfully completed.
ORA-20002: UNKNOWN
ORA-20002: UNKNOWN


PL/SQL procedure successfully completed.
ORA-20001: FAILED
PL/SQL procedure successfully completed.
ORA-06502: PL/SQL: numeric or value error
PLS-00567: cannot pass NULL to a NOT NULL constrained formal parameter



Вместо ORA-06502 ожидалось UNKNOWN.
Или это логично??

Кстати, последние две ошибки возникают даже если тело инвалид.
Например, если добавить "PROCEDURE FAKE;" в спеку и откомпилировать.
...
Рейтинг: 0 / 0
BOOLEAN NOT NULL
    #39605210
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BOOLEAN NOT NULLВместо ORA-06502 ожидалось UNKNOWN.
Или это логично??А для чего ты тогда декларировал NOT NULL-ьность?
BOOLEAN NOT NULLКстати, последние две ошибки возникают даже если тело инвалид.Оптимизирующий компилятор.
...
Рейтинг: 0 / 0
BOOLEAN NOT NULL
    #39605881
BOOLEAN NOT NULL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ElicА для чего ты тогда декларировал NOT NULL-ьность?Подразумевалось, что булева переменная может принимать три значения - истина/ложь/неопределено.
Если значение неопределено выдавать - cannot pass NULL to a NOT NULL.
Что сигнализировало бы о том, что assert свалился потому что одну из входящих величин предварительно не проверили на ненульность.
Эта же ошибка ожидалась, если условие проверки вообще не задано.

Оказалось, что NULL и UNKNOWN - это разные вещи.
С другой стороны, LNNVL(NULL) и LNNVL(NULL=1) тоже принимают разные значения, так что...
...
Рейтинг: 0 / 0
BOOLEAN NOT NULL
    #39605915
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BOOLEAN NOT NULLОказалось, что NULL и UNKNOWN - это разные вещи.Ты ни черта не понял.
...
Рейтинг: 0 / 0
BOOLEAN NOT NULL
    #39606082
BOOLEAN NOT NULL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ElicBOOLEAN NOT NULLОказалось, что NULL и UNKNOWN - это разные вещи.Ты ни черта не понял.Зато ты понимаешь и даже сможешь обосновать?
...
Рейтинг: 0 / 0
BOOLEAN NOT NULL
    #39606087
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BOOLEAN NOT NULLЗато ты понимаешь и даже сможешь обосновать?Будь проще. Может к тебе и потянутся люди.
...
Рейтинг: 0 / 0
BOOLEAN NOT NULL
    #39606181
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BOOLEAN NOT NULL,

ты отвечаешь на не заданные тебе вопросы.
существо дело в ответе вопрос
ElicА для чего ты тогда декларировал NOT NULL-ьность?

BOOLEAN NOT NULLВместо ORA-06502 ожидалось UNKNOWN.
Или это логично??
....
Кстати, последние две ошибки возникают даже если тело инвалид.


на это тебе ответили:
ElicОптимизирующий компилятор

я тебе переведу:
в вызове:
Код: plsql
1.
EXEC PKG.ASSERT_NN(NULL);


Null - это литерал.
И компилятору не требуется тело пакета для принятия решения о том, что вызов не соответствует заявленной в интерфейсе спецификации метода assert
Поэтому ты получаешь ошибку времени компиляции, а не выполнения.

BOOLEAN NOT NULLС другой стороны, LNNVL(NULL) и LNNVL(NULL=1) тоже принимают разные значения, так что...
что бы там ни было, но LNNVL(NULL) вообще не может принимать значения передаваемого параметра Null. Раз не может принять аргумента, значит не может дать результата.
Этот вызов не "разного значения" с LNNVL(NULL=1), а просто не работает.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / BOOLEAN NOT NULL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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