如何动态执行insert语句

时间:2015-03-03 11:38:55

标签: postgresql plpgsql dynamic-sql

我们的数据库是PostgreSQL 9.3.5。我们需要动态执行insert语句。为此,我们编写了这样的代码:

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这些是列。每个列都有我们需要将这些值插入表中的值。

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

提出通知'%',v_str;

数据输出:

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

execute v_str;

但是我们遇到了语法错误。

1 个答案:

答案 0 :(得分:2)

输出''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)