Курсор неправильно извлекает значения в Postgresql

#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», что является переменной, которая, по-видимому, не служит никакой цели.