Я пытаюсь создать функцию, которая должна сопоставить строку таблицы с моим пользовательским типом и вернуть ее в результате. Если какой-то столбец в этой таблице равен NULL, то NOT NOT NULL проверка моего пользовательского типа не работает! Проверьте пример:
У меня есть простой пользовательский тип:
CREATE TYPE my_custom_type AS (
sender VARCHAR(30),
destination VARCHAR(30),
count INTEGER
);
И таблица:
CREATE TABLE messages (
id INTEGER PRIMARY KEY,
sender VARCHAR(30),
destination VARCHAR(30),
count INTEGER
);
Вставьте одну строку для этого примера:
INSERT INTO messages VALUES (1, 'sender', 'destination', 100);
И теперь я хочу создать функцию, которая будет возвращать эту строку как пользовательский тип Postgres:
CREATE OR REPLACE FUNCTION my_custom_function()
RETURNS my_custom_type AS
$$
DECLARE
result my_custom_type;
BEGIN
SELECT sender, destination, count
FROM messages
LIMIT 1
INTO result;
IF result IS NULL THEN
RAISE EXCEPTION 'no data';
END IF;
RETURN result;
END; $$
LANGUAGE plpgsql;
Когда я использую эту функцию, я получаю хорошие результаты:
SELECT * from my_custom_function();
Но странные вещи начинают происходить, когда какой-то столбец обновляется до NULL:
UPDATE messages SET destination = NULL;
Когда я снова выполняю функцию, она все еще возвращает хорошие результаты:
Но если я изменил условие IS NULL на условие IS NOT NULL:
CREATE OR REPLACE FUNCTION my_custom_function()
RETURNS my_custom_type AS
$$
DECLARE
result my_custom_type;
BEGIN
SELECT sender, destination, count
FROM messages
LIMIT 1
INTO result;
IF result IS NOT NULL THEN
RETURN result;
END IF;
RAISE EXCEPTION 'no data';
END; $$
LANGUAGE plpgsql;
Тогда я получил ошибку: ОШИБКА: нет данных
Может кто-нибудь объяснить, почему это не работает? Это не имеет смысла для меня ...