我们的数据库是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;
但是我们遇到了语法错误。
答案 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)