2016-04-08 30 views
1

テーブルにデータを挿入してデータ型serialを返す関数を作成したいと考えています。あなたが何をする必要があるPL/pgSQL関数の "ERROR:クエリに結果データの宛先がありません"

CREATE OR REPLACE FUNCTION ins_uuser(p_user_name text, p_real_name text, p_age int, p_city text) 
RETURNS integer AS 
$$ 
    INSERT INTO uuser(user_name, last_login, real_name, age, city) 
    VALUES($1, CURRENT_TIMESTAMP, $2, $3, $4) 
    RETURNING uid; 
$$ 
LANGUAGE sql VOLATILE; 

しかし、あなたは本当に(つまり、通常は遅くなるが)PL/pgSQLのを使用する場合:

あなたはこのためにPL/pgSQLの必要はありません
CREATE TABLE uuser (
    uid serial PRIMARY KEY 
, user_name text NOT NULL 
, last_login timestamptz NOT NULL DEFAULT current_timestamp 
, real_name text 
, age int 
, city text 
, CHECK (age > 0 and age < 140) 
); 

CREATE OR REPLACE FUNCTION ins_uuser(p_user_name text 
            , p_real_name text 
            , p_age int 
            , p_city text) 
RETURNS integer AS 
$$ 
BEGIN 
INSERT INTO uuser(user_name, last_login, real_name, age, city) 
VALUES($1, CURRENT_TIMESTAMP, $2, $3, $4) 
RETURNING uid; 
END; 
$$ 
LANGUAGE plpgsql VOLATILE; 

SELECT ins_uuser('Joker', 'Jack', 18, 'New York') AS uuser_id; 
ERROR: query has no destination for result data 
CONTEXT: PL/pgSQL function ins_uuser(text,text,integer,text) line 3 at SQL statement 

答えて

1

エラーメッセージは言う:あなたは、いくつかの変数に結果を格納する必要があります。


CREATE OR REPLACE FUNCTION ins_uuser(p_user_name text, p_real_name text, p_age int, p_city text) 
RETURNS integer AS 
$$ 
declare 
    new_id integer; 
BEGIN 
    INSERT INTO uuser(user_name, last_login, real_name, age, city) 
    VALUES($1, CURRENT_TIMESTAMP, $2, $3, $4) 
    RETURNING uid 
    into new_id; --<<< this stores the result in the variable 

    return new_id; 
END; 
$$ 
LANGUAGE plpgsql VOLATILE; 
+0

それは働きます!どうもありがとうございます! –

関連する問題