【问题标题】:Return TEMPORARY TABLE as table in pl/pgsql将 TEMPORARY TABLE 作为 pl/pgsql 中的表返回
【发布时间】:2018-10-17 02:02:19
【问题描述】:

场景很简单。将一组结果定义为TEMPORARY TABLE,在另一个查询中使用它作为其IN 部分,然后在所有查询完成后,返回TEMPORARY TABLE

在我的例子中,定义delete_group,在DELETE 中使用它,然后返回delete_group

我想出了这个

CREATE  FUNCTION update_delete_honda
(modelId bigint, hondaId bigint)
RETURNS TABLE
(id bigint,name text) 
AS $$
DECLARE
 var_r record;
BEGIN    

CREATE TEMPORARY TABLE delete_group (honda_id bigint,name text)
ON COMMIT DROP;
INSERT INTO delete_group (honda_id,name)
SELECT honda_id,name FROM car WHERE service_id is null and drive_id is null;


 EXECUTE format(
   'UPDATE car SET model_Id = null WHERE honda_Id=$1'
) USING modelId , hondaId;

DELETE FROM suv WHERE id  IN (select honda_id from delete_group);

 FOR var_r IN(delete_group)  
 LOOP
   id := honda_id ; 
   name := name ;
   RETURN NEXT;
 END LOOP;

END;
$$
LANGUAGE plpgsql;

这不起作用。我得到ERROR: syntax error at or near "delete_group" 关于FOR var_r IN(delete_group) 行。

我该如何解决这个问题?我使用 PostgreSQL 10

谢谢

【问题讨论】:

    标签: postgresql plpgsql postgresql-10


    【解决方案1】:

    将循环更改为

    FOR var_r IN SELECT * FROM delete_group,

    并在

    中使用suv.id(而不仅仅是id

    DELETE FROM suv WHERE suv.id IN (select honda_id from delete_group);

    您没有提供表 car 和 suv 的定义,所以我无法确定该函数是否真的按照您的意愿行事......但以上应该是正确的语法。

    【讨论】:

    • 我做了FOR var_r IN SELECT * FROM delete_group LOOP id := honda_id ; name := name ; RETURN NEXT; END LOOP;,我得到了ERROR: column "honda_id" does not exist。我试过 FOR var_r IN (SELECT * FROM delete_group) ,同样的错误。我也试过FOR var_r IN (SELECT * FROM delete_group) LOOP id := delete_group.honda_id ; name := delete_group.name ; RETURN NEXT; END LOOP; 并得到ERROR: missing FROM-clause entry for table "delete_group" 谢谢
    • 嗯,你试过id := var_r.honda_id ; name := var_r.name吗?
    猜你喜欢
    • 1970-01-01
    • 2011-05-31
    • 2012-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-16
    相关资源
    最近更新 更多