2013-07-04 40 views
0

我正在使用PostgreSQL 8.4。我的目标是在PL/pgSQL的帮助下插入多行,并将插入的记录的--s返回到记录集中。PL/pgSQL - 插入多行,返回结果集中的ID

起初,我试图做一个单列,使用下面的代码为我permission_create(..)功能:

CREATE FUNCTION permission_create(
    IN method permission.permission_method % TYPE, 
    IN resource permission.permission_resource % TYPE 
) 
    RETURNS TABLE(id permission.permission_id % TYPE) 
AS 
    $BODY$ 
    BEGIN 
    RETURN QUERY 
     WITH inserted_permission AS (
     INSERT INTO permission (permission_id, permission_method, permission_resource) VALUES (DEFAULT, method, resource) 
     RETURNING permission_id 
    ) 
     SELECT 
     inserted_permission.permission_id AS id 
     FROM inserted_permission; 
    END; 
    $BODY$ 
LANGUAGE plpgsql VOLATILE; 

但是,我得到了以下错误消息:

[2013-07-04 17:38:01] [00000] type reference permission.permission_method%TYPE converted to character varying 
[2013-07-04 17:38:01] [00000] type reference permission.permission_resource%TYPE converted to character varying 
[2013-07-04 17:38:01] [00000] type reference permission.permission_id%TYPE converted to integer 
[2013-07-04 17:38:01] [00000] type reference permission.permission_id%TYPE converted to integer 
[2013-07-04 17:38:01] [42601] ERROR: syntax error at or near "INSERT" 
    Where: SQL statement in PL/PgSQL function "permission_create" near line 9 

应该如何我解决这个问题?有多种方式可以做到这一点吗?

解决方案:

CREATE FUNCTION permission_create(
    IN method permission.permission_method % TYPE, 
    IN resource permission.permission_resource % TYPE 
) 
    RETURNS TABLE (id INT) 
AS 
    $BODY$ 
    BEGIN 
    RETURN QUERY 
    INSERT INTO permission (permission_id, permission_method, permission_resource) 
     VALUES (DEFAULT, method, resource) 
    RETURNING permission_id; 
    END; 
    $BODY$ 
LANGUAGE plpgsql VOLATILE; 

回答

2

可更新的CTE是从9.1的PostgreSQL支持。

你不需要使用CTE(你的情况)

 
postgres=# CREATE OR REPLACE FUNCTION fx() 
RETURNS SETOF int AS $$ 
BEGIN 
    RETURN QUERY INSERT INTO taba(a) VALUES(1),(2) 
    RETURNING *; 
    RETURN; 
END; 
$$ LANGUAGE plpgsql; 
CREATE FUNCTION 
postgres=# select * from fx(); 
fx 
---- 
    1 
    2 
(2 rows) 
+0

喔感谢,现在的工作。 – inf3rno