Ошибка PostgreSQL: у запроса нет места назначения для данных результата - PullRequest
3 голосов
/ 17 февраля 2012

Попытка проникнуть в PostgreSQL.Я рисую функцию, которая будет проверять учетные данные

Вот оно:

CREATE or REPLACE  FUNCTION CkeckUser (Login varchar(50), Password varchar(50)) 
RETURNS TABLE(ID int, IDParent int, Text varchar(50), Image bytea, DLLName varchar(50), MethodName varchar(50), Parameters varchar(250) )
 AS $$
DECLARE
  idu INT;
BEGIN

idu := null;

 select idu = u."ID"
 FROM  "Users" u
 where (u."Login" = $1) and (u."Password" = $2);

  select 
utm."IDMenuItem" as ID,
utm."IDParentMenuItem" as IDParent,
m."Text",
m."Image",
m."DLLName",
m."MethodName",
m."Parameters"
    from        "Users" u
            join "UserTypes" ut on u."Type" = ut."ID"
            join "UserTypeMenu" utm on u."Type" = utm."IDUserType"
            join "Menu" m on utm."IDMenuItem" = m."ID";
where u."ID" = IDU;
order by m."ID";

END; $$
 LANGUAGE 'plpgsql';

Логика довольно проста, но при ее выполнении

 select CkeckUser(N'admin', N'test');

или

  select * from CkeckUser(N'admin', N'test');

Я получил

  ERROR:  query has no destination for result data

где я не прав?

1 Ответ

9 голосов
/ 17 февраля 2012

В PL / pgSQL вы не можете просто выполнить запрос; Вы должны поместить результаты куда-нибудь. Я так понимаю, вы хотите, чтобы функция возвращала результат запроса?

Вы можете поставить RETURN QUERY перед запросом, который добавит свой набор результатов к возвращаемому значению функции, но в вашем случае, если это вся ваша хранимая процедура, возможно, проще просто изменить вашу хранимую процедура должна быть чистым SQL, а не PL / pgSQL:

CREATE or REPLACE FUNCTION CkeckUser (Login varchar(50), Password varchar(50)) 
RETURNS TABLE(ID int, IDParent int, Text varchar(50), Image bytea, DLLName varchar(50), MethodName varchar(50), Parameters varchar(250) )
  AS
  $$
    SELECT utm."IDMenuItem" AS ID,
           utm."IDParentMenuItem" as IDParent,
           m."Text",
           m."Image",
           m."DLLName",
           m."MethodName",
           m."Parameters"
      FROM "Users" u
      JOIN "UserTypes" ut
        ON u."Type" = ut."ID"
      JOIN "UserTypeMenu" utm
        ON u."Type" = utm."IDUserType"
      JOIN "Menu" m
        ON utm."IDMenuItem" = m."ID"
     WHERE u."ID" = ( SELECT u."ID"
                        FROM "Users" u
                       WHERE u."Login" = $1
                         AND u."Password" = $2
                    )
     ORDER
        BY m."ID"
  $$
  LANGUAGE 'SQL'
;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...