试图进入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
我哪里错了?
答案 0 :(得分:9)
在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'
;