2015-03-03 90 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問題,其中只有包括頭一個完整的功能將提供必要的環境。並始終提供逐字錯誤消息。 – 2015-03-04 13:59:34

回答

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)