代码之家  ›  专栏  ›  技术社区  ›  Alexis.Rolland user2915097

带INSERT…RETURNING的PosgreSQL函数使查询没有结果数据的目标

  •  1
  • Alexis.Rolland user2915097  · 技术社区  · 7 年前

    我已经看到许多关于同一错误消息的问题,但是我找不到一个具有相同用例的问题。下面是我的计划。我基本上需要我的函数返回插入到 base.batch 桌子。注意,我希望稍后用Postgraphile调用这个函数。比较示例 custom mutation I have used here

    CREATE SCHEMA base;
    
    CREATE TABLE base.indicator_group (
        id SERIAL PRIMARY KEY,
        indicator_group TEXT NOT NULL UNIQUE,
        created_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        updated_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    );
    
    INSERT INTO base.indicator_group (indicator_group) VALUES ('test');
    
    CREATE TABLE base.batch (
        id SERIAL PRIMARY KEY,
        status TEXT NOT NULL,
        created_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        updated_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        indicator_group_id INTEGER NOT NULL REFERENCES base.indicator_group(id)
    );
    
    CREATE OR REPLACE FUNCTION base.execute_indicator_group(id integer)
    RETURNS base.batch AS $$
    BEGIN
        INSERT INTO base.batch (status, indicator_group_id) VALUES ('Pending', 1)
        RETURNING *;
    END;
    $$ LANGUAGE plpgsql VOLATILE STRICT SECURITY DEFINER;
    

    我调用函数如下:

    select base.execute_indicator_group(1);
    

    它返回错误:

    错误:查询没有结果数据上下文的目标:PL/pgSQL 函数基。在SQL语句处执行指示符组(整数)第3行

    1 回复  |  直到 7 年前
        1
  •  2
  •   klin    7 年前

    使用简单的SQL函数:

    CREATE OR REPLACE FUNCTION base.execute_indicator_group(id integer)
    RETURNS base.batch AS $$
        INSERT INTO base.batch (status, indicator_group_id) VALUES ('Pending', 1)
        RETURNING *;
    $$ LANGUAGE sql STRICT SECURITY DEFINER;
    

    把它用在 FROM 条款:

    SELECT * FROM base.execute_indicator_group(1);
    
     id | status  |        created_date        |        updated_date        | indicator_group_id 
    ----+---------+----------------------------+----------------------------+--------------------
      1 | Pending | 2018-08-06 23:43:15.076431 | 2018-08-06 23:43:15.076431 |                  1
    (1 row)
    

    在plpgsql函数中(如果您想在函数中另外执行一些操作),您需要一个变量:

    CREATE OR REPLACE FUNCTION base.execute_indicator_group(id integer)
    RETURNS base.batch AS $$
    DECLARE
        result base.batch;
    BEGIN
        INSERT INTO base.batch (status, indicator_group_id) VALUES ('Pending', 1)
        RETURNING *
        INTO result;
        RETURN result;
    END;
    $$ LANGUAGE plpgsql VOLATILE STRICT SECURITY DEFINER;