在函数内插入失败,“查询没有结果数据的目标”

Rod*_*ham 2 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');
Run Code Online (Sandbox Code Playgroud)

当我运行这个(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
Run Code Online (Sandbox Code Playgroud)

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

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

a_h*_*ame 7

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

不,你不是。

RETURNING v_new_id;简单的意思是:
从这个插入语句返回变量的当前值v_new_id

(这是null因为变量从未被赋值)

您没有生成的值存储在任何地方。

您要么需要使用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;
Run Code Online (Sandbox Code Playgroud)

或者转换一切它简单的 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;
Run Code Online (Sandbox Code Playgroud)