Столбец не существует при создании представления с функцией

#sql #postgresql

Вопрос:

Я пытаюсь создать функцию в postgres, которая получает электронное письмо пользователя, получает идентификатор пользователя из users таблицы и создает представление на основе этого идентификатора пользователя. Это и есть функция:

 create or replace function userpins_fn(email_tk text)
returns int
LANGUAGE 'plpgsql'
as 
$
declare
userid_tk integer;
begin
userid_tk = (select id from users where email = email_tk);

create or replace view userpins_view as select
level_pg, latitude_pg, longitude_pg, data_pg, hora_pg
from saved_pins
where userid_pg = userid_tk;

return  userid_tk;
end
$
 

Он возвращает идентификатор пользователя только потому, что он должен что-то вернуть, на самом деле это не имеет значения.
Так что здесь все в порядке, все работает идеально, но когда я select userpins_fn('useremail@mail.com'); обновляю представление, чтобы оно соответствовало электронной почте этого пользователя, я получаю эту ошибку:

 ERROR:  column "id_user" does not exist
LINE 4: where utilizadorid_pg = id_user
                                ^
QUERY:  create or replace view pinsgajoview as select
nivel_pg, latitude_pg, longitude_pg, data_pg, hora_pg
from pins_guardados
where utilizadorid_pg = id_user
CONTEXT:  PL/pgSQL function userpins_fn(text) line 7 at SQL statement
SQL state: 42703
 

Я этого не понимаю… Я выполнял аналогичные функции, и у меня не было подобной ошибки… Мой постгрес прослушивается? Неужели я упускаю что-то настолько важное, что даже не могу заметить? Пожалуйста, помогите мне…

Комментарии:

1. что такое id_user ? это не объявлено в вашей функции, просто в return id_user 😉

2. я редактировал его, чтобы опубликовать здесь, забыл изменить и это тоже. xD теперь он отредактирован

3. ты не можешь этого сделать. Если вы хотите «передать параметр в представление», решение состоит в том, чтобы вместо этого создать функцию возврата набора

Ответ №1:

То, что вы пытаетесь сделать, не может быть сделано так, как вы пытаетесь это сделать

См. документацию :

Подстановка переменных в настоящее время работает только в командах SELECT, INSERT, UPDATE и DELETE, поскольку основной механизм SQL разрешает параметры запроса только в этих командах. Чтобы использовать непостоянное имя или значение в других типах операторов (обычно называемых операторами утилиты), необходимо создать оператор утилиты в виде строки и ВЫПОЛНИТЬ его.

Комментарии:

1. Большое вам спасибо, ваш ответ мне помог, спасибо!