2017-01-10 5 views
1

「クエリが結果データには先がありません」で失敗する完全なサンプルコードです:挿入はここで

CREATE TABLE testtbl (
    id  integer NOT NULL, 
    intval integer, 
    strval varchar(64) 
); 
CREATE SEQUENCE testtbl_id_seq 
    START WITH 1 INCREMENT BY 1 
    NO MINVALUE NO MAXVALUE CACHE 1; 
ALTER SEQUENCE testtbl_id_seq OWNED BY testtbl.id; 
ALTER TABLE ONLY testtbl ALTER COLUMN id SET DEFAULT 
    nextval('testtbl_id_seq'::regclass); 
ALTER TABLE ONLY testtbl ADD CONSTRAINT testtbl_pkey PRIMARY KEY (id); 

CREATE FUNCTION insert_testtbl (p_intval integer, p_strval varchar(64)) 
    RETURNS integer AS $$ 
    DECLARE 
    v_new_id integer; 
    BEGIN 
    INSERT INTO testtbl (intval, strval) VALUES (p_intval, p_strval) 
     RETURNING v_new_id; 
    RETURN v_new_id; 
    END; 
$$ LANGUAGE plpgsql; 

SELECT insert_testtbl(1, 'One'); 

私は(PostgreSQLのバージョンは9.6.1です)これを実行すると、私が手:

ERROR: query has no destination for result data 
CONTEXT: PL/pgSQL function insert_testtbl(integer,character varying) line 5 at SQL statement 

これは意味をなさない。 I AM結果の宛先を指定してください!

私はここで間違っていますか?ありがとう!!!

答えて

3

結果の宛先を指定しています。

あなたはいません。

RETURNING v_new_id;は単に意味:
を「このINSERT文から変数v_new_idの現在の値を返す」

(変数に値が割り当てられていなかったとしてnullである)

あなたはそうではありませんどこにも生成された値を格納する。

CREATE FUNCTION insert_testtbl (p_intval integer, p_strval varchar(64)) 
    RETURNS integer AS $$ 
    DECLARE 
    v_new_id integer; 
    BEGIN 
    INSERT INTO testtbl (intval, strval) VALUES (p_intval, p_strval) 
     RETURNING id 
     INTO v_new_id; --<<< HERE 
    RETURN v_new_id; 
    END; 
$$ LANGUAGE plpgsql; 

それとも単純なSQL機能のすべてを変換します:

あなたはどちらかがinto句を使用する必要が

CREATE FUNCTION insert_testtbl (p_intval integer, p_strval varchar(64)) 
    RETURNS integer AS 
$$ 
    INSERT INTO testtbl (intval, strval) VALUES (p_intval, p_strval) 
    RETURNING id; 
$$ LANGUAGE sql; 
+0

素晴らしいを!ありがとうございました!! –

+0

@RodTurnham:これで問題が解決した場合は、解答を受け入れて、あなたの質問に解決済みとマークされているようにしてください。 –

関連する問題