使用postgres for循环中的记录将记录从一个表插入另一个表

时间:2016-08-10 07:36:57

标签: postgresql for-loop record

我正在尝试使用for循环在postgres中将数据从一个表插入另一个表。方法如下:

DO LANGUAGE PLPGSQL $$
DECLARE
data record;

BEGIN

FOR data IN SELECT * FROM forall_data
LOOP
INSERT INTO for_loop values data;<br>
END LOOP;
END;
$$ 

我已经使用了行迭代的记录,但无法找到如何将'data'插入'for_loop'表。当我运行此代码时,它给出了以下错误:

ERROR:  syntax error at or near "data"
LINE 9: INSERT INTO for_loop values data;
                                    ^

这是我的两张桌子。

create table forall_data(
nid numeric(15,0)not null,
name varchar(15) not null,
city varchar(10) not null,
contact numeric(11,0) not null
);

create table for_loop(
nid numeric(15,0)not null,
name varchar(15) not null,
city varchar(10) not null,
contact numeric(11,0) not null
); 

我应该在此尝试将“数据”记录插入“for_loop”表中?提前谢谢。

3 个答案:

答案 0 :(得分:1)

使用此代码:

DO LANGUAGE PLPGSQL $$
DECLARE
rec record;

BEGIN

FOR rec IN SELECT * FROM budzet.forall_data
LOOP
INSERT INTO budzet.for_loop(nid, name , city , contact)
    VALUES (rec.nid, rec.name , rec.city , rec.contact);

END LOOP;
END;
$$ 

答案 1 :(得分:1)

&#39;数据&#39;是无类型记录,所以我必须提到列名来检索此记录的值。

DO LANGUAGE PLPGSQL $$
DECLARE
data record;

BEGIN

FOR data IN SELECT * FROM forall_data
LOOP
INSERT INTO for_loop values (data.nid,data.name,data.city,data.contact);
END LOOP;
END;
$$ 

但是使用%rowtype或table类型更灵活,无需提及列名来从变量中检索列值

DO LANGUAGE PLPGSQL $$
DECLARE
data forall_data;  --- or data forall_data%rowtype 

BEGIN

FOR data IN SELECT * FROM forall_data
LOOP
INSERT INTO for_loop select (data).*;
END LOOP;
END;
$$ 

欢呼:)

答案 2 :(得分:0)

您可以尝试使用某些退出条件循环。

    DO LANGUAGE PLPGSQL $$
    DECLARE
    rec CURSOR FOR SELECT * FROM forall_data;
    V_nid numeric;
    V_name varchar(15);
    V_city varchar(10);
    V_contact numeric;

    BEGIN
    OPEN rec;
    LOOP
    FETCH rec INTO V_nid ,V_name ,V_city,V_contact;
     EXIT WHEN(rec IS NULL);
    INSERT INTO for_loop(nid, name , city , contact)
        VALUES (V_nid , V_name , V_city , V_contact);

    END LOOP;
CLOSE rec;
    END;
    $$ 

希望它适合你。

  

编辑:或者你可以尝试这个,而不使用一个表中的循环插入语句和另一个表中的select语句。

INSERT INTO for_loop(nid, name , city , contact)
select nid, name , city , contact FROM forall_data;