2015-07-28 83 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