Widzę dwa możliwe powody, dlaczego...
Żadna z tych podwyżek nie pojawia się w moim dzienniku wiadomości
Nie zalogowany
Po pierwsze, NOTICE
nie jest zwykle zapisywany w dzienniku bazy danych z ustawieniami domyślnymi. Cytuję instrukcję tutaj:
log_min_messages
(enum
)
Kontroluje, które poziomy komunikatów są zapisywane w dzienniku serwera. Prawidłowe wartości to DEBUG5
, DEBUG4
, DEBUG3
, DEBUG2
, DEBUG1
, INFO
, NOTICE
, WARNING
, ERROR
, LOG
, FATAL
i PANIC
. (...)
Domyślnie OSTRZEŻENIE . Zauważ, że LOG
ma tu inną pozycję niż w client_min_messages
.
Moje odważne podkreślenie. Zwróć także uwagę na inną wartość domyślną (NOTICE
) dla client_min_messages
(poprzednia pozycja w instrukcji).
Nieprawidłowy test
Po drugie, zastanów się, jak jest oceniane wyrażenie wiersza. Testowa row_variable IS NULL
zwraca TRUE
jeśli (i tylko jeśli) każdy element jest NULL
. Biorąc pod uwagę następujący przykład:
SELECT (1, NULL) IS NULL AS a -- FALSE
,(1, NULL) IS NOT NULL AS b -- also FALSE
Oba wyrażenia zwracają FALSE
. Innymi słowy, zmienna wiersza (lub rekordu) (1, NULL)
nie ma wartości NULL
, ani nie jest NOT NULL
. Dlatego oba testy nie powiodły się.
-> SQLfiddle więcej szczegółów.
Więcej szczegółów, wyjaśnień, linków i możliwe zastosowanie tego zachowania w CHECK
ograniczenie w tej powiązanej odpowiedzi:
Ograniczenie NOT NULL na zbiorze kolumn
Możesz nawet przypisać zmienną rekordu o wartości NULL (rec := NULL
), co powoduje, że każdy element ma wartość NULL - jeśli typ jest dobrze znanym typem wiersza. W przeciwnym razie mamy do czynienia z anonimowym rekordem, którego struktura jest niezdefiniowana i nie można uzyskać dostępu do elementów na początku. Ale tak nie jest w przypadku rowtype
jak w twoim przykładzie (który jest zawsze dobrze znany).
Rozwiązanie:FOUND
Jaki jest poprawny sposób sprawdzenia, czy otrzymałeś wiersz z SELECT * INTO
? ?
Musisz wziąć pod uwagę, że wiersz może mieć wartość NULL, nawet jeśli został przypisany. Zapytanie mogło równie dobrze zwrócić kilka wartości NULL (jeśli definicja tabeli w zapytaniu zezwala na wartości NULL). Taki test byłby z założenia niewiarygodny.
Istnieje proste i bezpieczne podejście. Użyj GET DIAGNOSTICS ...
lub (jeśli dotyczy) specjalną zmienną 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;
Szczegóły w instrukcji.