在函数中插入失败,"查询没有结果数据的目的地"

时间:2017-01-10 21:49:15

标签: postgresql stored-procedures sql-insert

以下是完整的示例代码:

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

这没有意义;我 AM 指定结果的目的地!

我在这里做错了什么?感谢!!!

1 个答案:

答案 0 :(得分:4)

  

我正在为结果指定目的地!

不,你不是。

RETURNING v_new_id;只是意味着:
从此插入语句

返回变量v_new_id的当前值

null因为变量从未被赋值(){/ p>

您不是在任何地方存储生成的值。

您需要使用into子句:

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函数:

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;