У меня есть следующие таблицы в базе данных Postgres 9.5:

product

 Column         |            Type             |                       Modifiers
----------------+-----------------------------+-----------------------------------------------------
id              | integer                     | not null default nextval('product_id_seq'::regclass)
name            | character varying(100)      |
number_of_items | integer                     |
created_at      | timestamp without time zone | default now()
updated_at      | timestamp without time zone | default now()
total_number    | integer                     |
provider_id     | integer                     |  
 Indexes:
    "pk_product" PRIMARY KEY, btree (id)
 Foreign-key constraints:
   "fk_product_provider" FOREIGN KEY (provider_id) REFERENCES provider(id)

И у нас также есть

provider

     Column    |            Typ         |           Modifiers
  -------------+------------------------+------------------------------
   id          |       integer          | not null default nextval('property_id_seq'::regclass)
   name        |       text             |
   description |       text             |
   created_at  | timestamp without time zone | default now()
   updated_at  | timestamp without time zone | default now()
 Indexes:
      "pk_provider" PRIMARY KEY, btree (id)

Я реализую plpgsql function, который должен найти некоторые конкретные продукты provider и просмотреть их

      products = select u_id, number_of_items from product 
          where provider_id = p_id and total_number > limit;
      loop 
          //here I need to loop through the products 

      end loop;

Вопрос какой тип data type я должен объявить для переменных products, чтобы хранить в нем запрошенные продукты? а также как мне позже получить доступ к его столбцам, таким как id или number_of_items?

0
Siavosh 10 Янв 2018 в 18:31

1 ответ

Лучший ответ

В PostgreSQL создание таблицы также определяет составной тип данных с тем же именем, что и таблица.

Вы можете использовать переменную этого типа:

DECLARE
   p product;
BEGIN
   FOR p IN SELECT product FROM product WHERE ...
   LOOP
      [do something with "p.id" and "p.val"]
   END LOOP;
END;

Или вы можете использовать несколько переменных для отдельных полей, которые вам нужны (возможно, лучше):

DECLARE
   v_id integer;
   v_val text;
BEGIN
   FOR v_id, v_val IN SELECT id, val FROM product WHERE ...
   LOOP
      [do something with "v_id" and "v_val"]
   END LOOP;
END;
2
Laurenz Albe 10 Янв 2018 в 16:32