#sql #postgresql
Вопрос:
Вот таблица, из которой я хочу получить информацию:
CREATE TABLE public.insurance_premiums (
contract_code text NOT NULL,
insurance_team text NOT NULL,
starting_date date NOT NULL,
expiration_date date NOT NULL,
contract_cost float8 NOT NULL,
vehicle_contract text NOT NULL,
customer_contract text NOT NULL,
driver_contract text NOT NULL,
CONSTRAINT insurance_premiums_pkey PRIMARY KEY (contract_code)
);
Вот курсор:
CREATE OR REPLACE FUNCTION get_info (s_d_1 DATE, s_d_2 DATE)
RETURNS TABLE (
contract_code text,
customer_contract text,
driver_contract text
) AS $
declare
new_contract record;
code text;
customer text;
driver text;
new_contract_cursor CURSOR (s_d_1 DATE, s_d_2 DATE) FOR
select insurance_premiums.contract_code, insurance_premiums.customer_contract, insurance_premiums.driver_contract
from public.insurance_premiums
where starting_date >= s_d_1 and starting_date <= s_d_2;
begin
open new_contract_cursor(s_d_1, s_d_2);
loop
fetch new_contract_cursor into new_contract;
exit when not found;
code := new_contract.contract_code;
customer := new_contract.customer_contract;
driver := new_contract.driver_contract;
return next;
end loop;
close new_contract_cursor;
end;$ language plpgsql;
Примечание: s_d_1 означает starting_date_1, то же самое относится и к s_d_2.
Вот также простой запрос ВЫБОРА:
select insurance_premiums.contract_code, insurance_premiums.customer_contract, insurance_premiums.driver_contract from public.insurance_premiums
where starting_date >= '2021/06/01' and starting_date <= '2021/06/30';
Этот SELECT
запрос извлекает правильные данные из таблицы. Он просто возвращает 2 строки с 3 столбцами, которые все являются текстом.
С другой стороны, курсор, даже если он создает новую таблицу и правильно извлекает 2 строки и 3 столбца, все данные имеют значение NULL вместо текста.
Я предполагаю, что что-то не так внутри цикла или в select
запросе внутри курсора.
Я также подумал о том факте, что я создаю новую таблицу с именами столбцов, которые совпадают с таблицей, которую я получаю, возможно, придется что-то делать. Я не думаю, что это все, но никогда не знаешь наверняка.
Комментарии:
1. Зачем для этого использовать курсор и медленный и неэффективный (вложенный) цикл или даже PL/pgSQL? Это можно легко сделать с помощью одной инструкции SELECT
2. Я просто изучаю курсоры, поэтому я хотел проверить это с помощью простого примера запроса.
Ответ №1:
Вы никогда ничего не назначали выходным параметрам, поэтому выходные данные состоят из нулей. Например, выходным параметром является «customer_contract», но вы назначаете «customer», что является переменной, которая, по-видимому, не служит никакой цели.