2012-02-17 71 views
3

試圖進入PostgreSQL。 我畫,將檢查憑證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

found !!!在最後一個select語句之前應該添加RETURN QUERY – DreadAngel 2012-02-17 15:44:59

回答

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' 
; 
相關問題