2015-07-28 3 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 Постулаты в петлю, так что цикл будет работать, как сейчас, но также все строки будут сохранены в таблице.

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

дело в том, что я не знаю, как сделать это ... вставка Постулаты имеет нормально синтаксис:

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, ...' i don Посмотрите, как я могу получить доступ к значениям thouse ... – avi

+0

Нет необходимости в функции или в цикле, просто используйте: 'insert into new_tab (id, name) выберите * from func3 (..)' Или вы хотите, чтобы ваш 'func1() ', чтобы вставлять строки ** и ** возвращать их в одно и то же время? –

ответ

1

Основная вставка со значениями выглядит следующим образом:

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

на основе дополнительных замечаний, которые необходимо использовать курсор вместо execute sqls.

+0

Можете ли вы объяснить, как мне получить значения? Я не знаю, что это за ценности. – avi

+0

В какое поле вы планируете вставить? у вас есть определение таблицы назначения? – Bulat

+0

таблица имеет те же поля, что тип TYPE_a – avi

1

Нет необходимости в цикле, вы можете использовать insert .. select ... returning в динамическом SQL точно так же:

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

Хорошо. могу ли я использовать этот метод, если я просто хочу вставить в таблицу? что означает изменение его на возврат void? – avi

Смежные вопросы