2012-02-17 17 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

が見つかりました!前回のSELECTステートメントを追加する前に戻るRETURN QUERY – DreadAngel

答えて

9

PL/pgSQLでは、単にクエリを実行することはできません。結果をどこかに置く必要があります。関数がクエリ結果を返すようにしたいと思いますか?

クエリの前にRETURN QUERYを置くことができます。結果セットは関数の戻り値に追加されますが、その場合はストアドプロシージャ全体であれば、ストアドプロシージャを変更するほうが簡単でしょうPL/pgSQLではなく純粋なSQLにする:

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' 
; 
関連する問題