Функция не выдает никаких ошибок и не показывает никакого возвращаемого значения.
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');
Я также вызываю функцию с библиотекой pg-promise в запросе API. Но это также возвращает нулевой массив
Почему это помечено как MySQL, если вы ищете решение для PostgreSQL? Кроме того, что вы пытались решить проблему
Похоже, вы неправильно вызываете функцию, должно быть что-то вроде этого, чтобы вызвать ее.
SELECT * INTO some_variable FROM login('[email protected]', 'passwords');
into some_variable
не нужен (на самом деле это неправильно, если вы хотите использовать функцию в простом SQL)
#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
. Никаких ошибок после его использования, но это усложнило отладку.
Использование явной ссылки на таблицу внутри запроса функции, чтобы избежать конфликта имен; все решил.
Как именно вы вызываете функцию?