2015-07-28 61 views
1

,我有以下plpgsql功能PostgreSQL如何插入一个循环行表

CREATE OR REPLACE FUNCTION func1() 
    RETURNS SETOF type_a AS 
$BODY$ 
declare 
    param text; 
    sqls varchar; 
    row type_a; 
begin 
    code..... 

    sqls='select * from func3(' || param || ') '; 
    for row in execute sqls LOOP 
     return next row; 
    END LOOP; 
    end if; 
    return; 
end 
$BODY$ 
    LANGUAGE plpgsql VOLATILE 

我要添加insert statment进入死循环,使回路会工作,因为它是,但现在所有的行也会保存在一张表中。

for row in execute sqls LOOP 
INSERT INTO TABLE new_tab(id, name) 
return next row; 

的事情是,我不知道该怎么做......插入statment normaly具有的语法:

INSERT INTO new_tab(id, name) 
SELECT x.id, x.name 
FROM y 

但是这句法不适合这里。没有查询从...中选择行,这些行在循环中。

+1

它也提供了其他语法值,请参阅http://www.w3schools.com/sql/sql_insert.asp – Bulat

+1

它也是一样的。使用INSERT INTO table_name(column1,column2,column3,...) VALUES(value1,value2,value3,...);'你需要指定'value1,value2,value3,...'不知道如何访问thouse值... – avi

+0

不需要函数或循环,只需使用:'insert into new_tab(id,name)select * from func3(..)'或者你想要'func1 ()'插入行**和**同时返回它们? –

回答

1

与价值基本插入看起来是这样的:根据你需要使用游标,而不是execute sqls补充意见

INSERT INTO table_name (column1,column2,column3,...) 
VALUES (value1,value2,value3,...); 

+0

你能解释我如何得到这些值吗?我不知道价值是什么。 – avi

+0

您打算插入什么字段?你有目标表的定义吗? – Bulat

+0

表的字段与TYPE type_a – avi

1

没有必要为一个循环,你可以在动态SQL中使用insert .. select ... returning一样好:

create or replace function func1() 
    returns table (id integer, name text) 
as 
$$ 
declare 
    param text; 
begin 
    param := ... ; 
    return query execute 
     'insert into new_tab (id, name) 
     select id, name 
     from func3($1) 
     returning *' 
    using param; 
end; 
$$ 
language plpgsql; 

请注意,我用了一个参数占位符和USING条款而不将参数进入查询 - 更多强大的。

+0

返回表的含义是什么? – avi

+0

这意味着函数返回一组行(“一个表”)。它基本上和'RETURNS SETOF type_a'一样,但是你不必首先为它创建一个类型。详情请参阅手册。 http://www.postgresql.org/docs/current/static/sql-createfunction.html –

+0

好吧。如果我只想插入表格,我可以使用这种方法吗?意味着改变它返回无效? – avi