2015-03-03 1 views
0

Наша база данных - PostgreSQL 9.3.5. Нам нужно выполнить динамическую вставку. Для этого мы написали код так: выходКак выполнить динамическую вставку оператора

v_seq bigint; 
v_levelname varchar(100); 
v_cols text; 
v_cols variable having concatenated data of all column names of particular a table(ex. L150). 

L150 table columns details 
---------------------------- 
id bigint; 
levelname varchar(100); 
healthcareno bigint; 
businessno bigint; 
bankingno bigint; 

v_insertstmt:='insert into L'||levelid||'---tablename(receiving tablename dynamically) 
values('||v_seq||','''||v_levelname||''','||v_cols||')'; 

raise notice '%',v_insertstmt; 

данных:

insert into L105 
values(1053911,''ProductPlanning'','||healthcareno||','||businessno||','||bankingno||') 

но healthcareno, businessno, bankingno это столбец columns.Each имеет значения, нам нужно вставить эти значения в таблицу.

v_str:=''''||v_insertstmt||'''';--we added quotes 

повысить уведомление «%», v_str;

Вывод данных:

'insert into L105 
values(1053911,''ProductPlanning'','||healthcareno||','||businessno||','||bankingno||')' 

execute v_str; 

Но мы получали ошибку синтаксиса.

+0

я соблазн игнорировать plpgsql вопросы с фрагментами кода, где только полная функция, включая заголовок будет обеспечить необходимый контекст. И всегда предоставляйте дословное сообщение об ошибке. –

ответ

1

Результат ''ProductPlanning'' неправ. Используйте пункт USING вместо:

execute format('insert into %I values($1, $2, $3, $4, $5)', 'L' || levelid) 
    using v_seq, v_levelname, ... ; 

postgres=# create table foo(a int, b text); 
CREATE TABLE 
postgres=# do $$ 
postgres$# begin 
postgres$# execute format('insert into %I values($1,$2)', 'foo') using 1, 'AHOJ'; 
postgres$# end; 
postgres$# $$; 
DO 
postgres=# select * from foo; 
a | b 
---+------ 
1 | AHOJ 
(1 row)