Невозможно установить для объекта нестандартного типа в plpgsql значение null.Вместо этого поля этого объекта становятся нулевыми - PullRequest
0 голосов
/ 28 марта 2019

Я пытаюсь присоединить null к объекту нестандартного типа к null. Но только поля внутри этого объекта становятся нулевыми вместо самого объекта.

Я пытался использовать флаг FOUND, чтобы определить, была ли назначена какая-либо строка моему объекту. Если найдено было ложным, то объект пользовательского типа устанавливается в нуль. Но когда я печатаю объект, в консоли pgadmin это выглядит так (,,,,,,).

Select id,provider_id,beneficiary_name,beneficiary_branch,beneficiary_account_number,swift_code,
    payment_terms,currency,bank_name,payment_entity,payment_type,invoice_due_date_type,last_updated_time
    INTO provider_payment_method_result
    from provider_info.provider_payment_method where provider_id = provider_id_param;
    IF NOT FOUND
       THEN provider_payment_method_result := NULL::provider_info_api.payment_method;
    END IF;
    raise notice 'found : %', found;
    raise notice 'payment_method % ', provider_payment_method_result;
    return provider_payment_method_result;

Я ожидаю

NOTICE: found : f NOTICE: payment_method null

Фактический результат

NOTICE: found : f NOTICE: payment_method (,,,,,,,,,,,,) 

1 Ответ

2 голосов
/ 28 марта 2019

Это зависит от версии PostgreSQL. Если PostgreSQL старше 10 лет, ожидается поведение, описанное вами. Строка (или составное значение) с NULL во всех полях фактически равна NULL. В этих версиях составное значение передается по значению каждый раз (с точки зрения SQL) и не может быть выражено как одно значение (хотя это значение равно NULL).

В PostgreSQL 10 и выше это поведение изменено.

CREATE TYPE xy AS (x int, y int);

DO $$
DECLARE _xy xy;
BEGIN
  _xy := (NULL, NULL);
  RAISE NOTICE '% %', _xy, _xy IS NULL;
END;
$$;

Если у вас более старый Postgres, и вы хотели бы видеть только NULL, используйте вместо него RECORD type.

...