【问题标题】:PL/pgSQL - insert multiple rows, returning the ids in a resultsetPL/pgSQL - 插入多行,返回结果集中的 id
【发布时间】:2013-07-02 16:28:16
【问题描述】:

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

起初我尝试在一行中执行此操作,将以下代码用于我的 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;

【问题讨论】:

    标签: postgresql plpgsql


    【解决方案1】:

    从 PostgreSQL 9.1 开始支持可更新 CTE。

    您不需要使用 CTE(在您的情况下)

    postgres=# 创建或替换函数 fx() 返回 SETOF int AS $$ 开始 返回查询插入到 taba(a) 值(1),(2) 返回 *; 返回; 结尾; $$ 语言 plpgsql; 创建函数 postgres=# select * from fx(); 外汇 ---- 1 2 (2 行)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-19
      • 2012-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多