Виждам две възможни причини, защо ...
Нито едно от тези повишения не се появява в моя регистър на съобщенията
Не е регистриран
Първо, NOTICE
обикновено не се записва в регистъра на базата данни с настройки по подразбиране. Цитирам ръководството тук:
log_min_messages
(enum
)Контролира кои нива на съобщения се записват в регистъра на сървъра. Валидни стойности са
DEBUG5
,DEBUG4
,DEBUG3
,DEBUG2
,DEBUG1
,INFO
,NOTICE
,WARNING
,ERROR
,LOG
,FATAL
иPANIC
. (...)
По подразбиране е ПРЕДУПРЕЖДЕНИЕ . Обърнете внимание, чеLOG
има различен ранг тук от този вclient_min_messages
.
Удебелен акцент мой. Също така имайте предвид различното по подразбиране (NOTICE
) за client_min_messages
(предишна точка в ръководството).
Невалиден тест
Второ, помислете как се оценява израз на ред. Тест row_variable IS NULL
връща TRUE
ако (и само ако) всеки един елемент е NULL
. Като се има предвид следният пример:
SELECT (1, NULL) IS NULL AS a -- FALSE
,(1, NULL) IS NOT NULL AS b -- also FALSE
И двете изразите връщат FALSE
. С други думи, променлива на ред (или запис) (1, NULL)
не е нито NULL
, нито е NOT NULL
. Следователно и двата ви теста се провалят.
-> SQLfiddle с повече подробности.
Повече подробности, обяснение, връзки и възможно приложение за това поведение в CHECK
ограничение в този свързан отговор:
NOT NULL ограничение върху набор от колони
Можете дори да зададете променлива на запис с NULL (rec := NULL
), което води до това, че всеки елемент е NULL - ако типът е добре познат тип ред. В противен случай имаме работа с анонимен запис и структурата е недефинирана и нямате достъп до елементи като начало. Но това не е така с rowtype
като във вашия пример (който винаги е добре известен).
Решение:FOUND
Какъв е правилният начин да тествате дали сте получили ред от
SELECT * INTO
?
Трябва да имате предвид, че редът може да бъде NULL, дори и да е бил присвоен. Заявката може много добре да е върнала куп стойности NULL (ако дефиницията на таблицата във вашата заявка позволява NULL стойности). Такъв тест би бил ненадежден по замисъл.
Има прост и сигурен подход. Използвайте GET DIAGNOSTICS ...
или (където е приложимо) специалната променлива FOUND
:
SELECT * FROM my_table WHERE owner_id = 6 INTO my_var;
IF NOT FOUND THEN
RAISE NOTICE 'Query did not return a row!';
END IF;
Подробности в ръководството.