Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / BOOLEAN NOT NULL / 7 сообщений из 7, страница 1 из 1
21.02.2018, 04:19
    #39605167
BOOLEAN NOT NULL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
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
21.02.2018, 07:31
    #39605210
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BOOLEAN NOT NULL
BOOLEAN NOT NULLВместо ORA-06502 ожидалось UNKNOWN.
Или это логично??А для чего ты тогда декларировал NOT NULL-ьность?
BOOLEAN NOT NULLКстати, последние две ошибки возникают даже если тело инвалид.Оптимизирующий компилятор.
...
Рейтинг: 0 / 0
22.02.2018, 02:50
    #39605881
BOOLEAN NOT NULL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BOOLEAN NOT NULL
ElicА для чего ты тогда декларировал NOT NULL-ьность?Подразумевалось, что булева переменная может принимать три значения - истина/ложь/неопределено.
Если значение неопределено выдавать - cannot pass NULL to a NOT NULL.
Что сигнализировало бы о том, что assert свалился потому что одну из входящих величин предварительно не проверили на ненульность.
Эта же ошибка ожидалась, если условие проверки вообще не задано.

Оказалось, что NULL и UNKNOWN - это разные вещи.
С другой стороны, LNNVL(NULL) и LNNVL(NULL=1) тоже принимают разные значения, так что...
...
Рейтинг: 0 / 0
22.02.2018, 07:30
    #39605915
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BOOLEAN NOT NULL
BOOLEAN NOT NULLОказалось, что NULL и UNKNOWN - это разные вещи.Ты ни черта не понял.
...
Рейтинг: 0 / 0
22.02.2018, 12:46
    #39606082
BOOLEAN NOT NULL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BOOLEAN NOT NULL
ElicBOOLEAN NOT NULLОказалось, что NULL и UNKNOWN - это разные вещи.Ты ни черта не понял.Зато ты понимаешь и даже сможешь обосновать?
...
Рейтинг: 0 / 0
22.02.2018, 12:52
    #39606087
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BOOLEAN NOT NULL
BOOLEAN NOT NULLЗато ты понимаешь и даже сможешь обосновать?Будь проще. Может к тебе и потянутся люди.
...
Рейтинг: 0 / 0
22.02.2018, 15:04
    #39606181
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BOOLEAN NOT NULL
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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / BOOLEAN NOT NULL / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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