#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. Большое вам спасибо, ваш ответ мне помог, спасибо!