Как вернуть данные в функцию входа в PL/pgSQL? Я хочу вернуть таблицу, в которой совпадают адрес электронной почты и пароль. Электронная почта уникальна

Функция не выдает никаких ошибок и не показывает никакого возвращаемого значения.

CREATE OR REPLACE FUNCTION login(iemail VARCHAR,ipassword VARCHAR)
RETURNS TABLE(id INTEGER, name VARCHAR, lastName VARCHAR, age INTEGER, mobile VARCHAR,email VARCHAR)
LANGUAGE 'plpgsql'
AS $$
#variable_conflict use_variable
BEGIN
RETURN QUERY SELECT id, name, lastName, age, mobile,email from usertable WHERE email = iemail AND password = ipassword;
END;
$$;

Ниже запрос дает мне возвращаемое значение. Итак, я знаю, что мой запрос правильный. Также проверяются возвращаемые типы переменных.

SELECT id, name, lastName, age, mobile,email from usertable 
WHERE email='[email protected]' AND password ='passwords';

я вызываю функцию с помощью:

SELECT * FROM login('[email protected]','passwords');

Как именно вы вызываете функцию?

a_horse_with_no_name 17.01.2023 09:05

Я также вызываю функцию с библиотекой pg-promise в запросе API. Но это также возвращает нулевой массив

Jay Sardar 17.01.2023 17:03

Почему это помечено как MySQL, если вы ищете решение для PostgreSQL? Кроме того, что вы пытались решить проблему

Nico Haase 17.01.2023 17:12
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
3
55
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Похоже, вы неправильно вызываете функцию, должно быть что-то вроде этого, чтобы вызвать ее.

SELECT * INTO some_variable FROM login('[email protected]', 'passwords');

into some_variable не нужен (на самом деле это неправильно, если вы хотите использовать функцию в простом SQL)

a_horse_with_no_name 17.01.2023 09:14
Ответ принят как подходящий

#variable_conflict use_variable является причиной. Поскольку все ваши выходные переменные (= столбцы) имеют то же имя, что и столбцы таблицы, Postgres возвращает выходные «переменные», которые не инициализированы.

Используйте явную ссылку на таблицу внутри запроса функции, чтобы избежать конфликта имен:

CREATE OR REPLACE FUNCTION login(iemail VARCHAR,ipassword VARCHAR)
RETURNS TABLE(id INTEGER, name VARCHAR, lastName VARCHAR, age INTEGER, mobile VARCHAR, email VARCHAR)
LANGUAGE plpgsql
AS $$
BEGIN
  RETURN QUERY 
    SELECT u.id, u.name, u.lastname, u.age, u.mobile, u.email 
    from usertable u
    WHERE u.email = iemail 
    AND u.password = ipassword;
END;
$$;

Обратите внимание, что для инкапсуляции простого запроса в функцию лучше всего подходит функция language sql — она также позволяет избежать конфликта между переменными и именами столбцов:

CREATE OR REPLACE FUNCTION login(iemail VARCHAR,ipassword VARCHAR)
  RETURNS TABLE(id INTEGER, name VARCHAR, lastName VARCHAR, age INTEGER, mobile VARCHAR, email VARCHAR)
LANGUAGE sql
AS $$
  SELECT id, name, lastname, age, mobile, email 
  from usertable 
  WHERE email = iemail 
  AND password = ipassword;
$$;

Спасибо, @horse_with_no_name. Я использовал #variable_conflict use_variable, чтобы избежать ERROR: column reference "name" is ambiguous. Никаких ошибок после его использования, но это усложнило отладку.

Jay Sardar 17.01.2023 17:41

Использование явной ссылки на таблицу внутри запроса функции, чтобы избежать конфликта имен; все решил.

Jay Sardar 17.01.2023 18:15

Другие вопросы по теме