postgresql - 如何动态执行insert语句

标签 postgresql plpgsql dynamic-sql

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

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

引发通知 '%',v_str;

数据输出:

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

execute v_str;

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

最佳答案

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

关于postgresql - 如何动态执行insert语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28830875/

相关文章:

django - 告诉 Django 使用哪个数据库模板

postgresql - 选择整数返回函数结果到变量 postgres

sql - 如何引用下一行的数据?

c# - 在带有 FROM 子句参数的存储过程中使用 LIKE 和 %

甲骨文创建功能

sql - 触发更新不同的表

PostgreSQL 触发器停止工作

php - PostgreSQL 多条件语句

sql - plpgsql 如何在函数或过程中执行查询

postgresql - 表 »rowtype« 缺少 FROM 子句条目