-- 目标:动态更新表中数据
-- 老规矩上代码-----------------------------tablename 表名--feildname 字段名数组--feildvalue 字段值数组--returnvalue 返回值
create or replace function f_update
( tablename text,
condition text,
feildname text[],
feildvalue text[],
out returnvalue text
) as $$
declare
mysql text;
myid integer;
myresult integer;
items text;
counts integer;
i integer;
begin
counts:=array_length(feildname,
1);
mysql:='update '||quote_ident(tablename)
||' set ';
for i
in 1..counts loop
mysql:= mysql
||quote_ident(feildname
[i])
||'='''||feildvalue
[i]||''',';
end loop;
mysql:=substring(mysql
from 1 for (char_length(mysql)
-1))
|| ' where 1=1 '||condition;
execute mysql;
GET DIAGNOSTICS myresult:= ROW_COUNT;
if myresult
<>0 then returnvalue
='{"success":"执行更新'||mysql
||'成功!"}';
else returnvalue
='{"success":"执行更新'||mysql
||'失败!"}';
end if;
end;
$$ language plpgsql;
-- 实际操作
create table test(id
integer,name
text,gen_time date,out returnvalue);
insert into test(id,name,gen_time)
values(
1,
'office',
'2017-08-19');
select f_update(
'test',
' and id=1',
'{name,gen_time}',
'{ssqhan,2017-08-20}');
-- 得到如下结果:
--里面的数据有点不太一样,不影响大家看--=======================================================================--不知道大家没有注意到,虽然 gen_time为date类型,但在UPDATE时,只要输入时间格式,--系统会自动的转成date格式--这是不是说,时间格式,在传递参数的时候,直接用字符串就OK?--有待验证,今天放在这里,以后有机会直接用C#访问数据库看会不会报错!--也希望做过的童鞋一起参与讨论。--实际上,是不会报错的!通过--====================================================================--但问题又来了:如里需要更新的字段里有 数值型 字段 和 字符型 字段该怎么处理呢?
--是分成两种类型分别处理,还是其它别的方法?--希望做过的朋友,给点意见!--一种解决思路见我的别一篇 随笔 postgresql 存储过程动态插入数据 2
==============================
2017-08-23日更新
--------------------------
首先,在这里严重感谢一下群友 南瓜!
基本这个程序全是他写的。
这里只是记下结果,以便以后回顾
===================================
create or replace function f_update_all(
tablename text,
update_feilds text,
condition_feilds text,
out return_value text
) as $$
declare
ex_sql text;
recs record;
_key text ;
_value text;
begin
ex_sql:='update '||quote_ident(tablename)
||' set ';
--setting values for updated table
for recs
in select * from json_array_elements(update_feilds::json) loop
_key :
= recs.value
->> 'feild_name';
_value := recs.value
->> 'feild_value' ;
if json_typeof(recs.value
-> 'feild_value')
='number' then
ex_sql:=ex_sql
|| _
key || '=' || _value
||',';
else
ex_sql:=ex_sql
|| _
key || '='''|| (recs.value
->> 'feild_value')
|| ''',';
end if;
end loop;
ex_sql:= substring(ex_sql
from 0 for length(ex_sql));
--setting condition in where
ex_sql:
=ex_sql
||' where 1=1';
for recs
in select * from json_array_elements(condition_feilds::json) loop
_key :
= recs.value
->> 'feild_name';
_value := recs.value
->> 'feild_value' ;
if json_typeof(recs.value
-> 'feild_value')
='number' then
ex_sql:=ex_sql
|| ' and ' || _
key || '=' || _value
||',';
else
ex_sql:=ex_sql
|| ' and ' || _
key || '='''|| (recs.value
->> 'feild_value')
|| ''',';
end if;
end loop;
ex_sql:= substring(ex_sql
from 0 for length(ex_sql));
return_value:=ex_sql;
end;
$$ language plpgsql;
当然,这里还是有个问题,对于text number 类型是没有问题的,
但如果是 date 也会更新,
其它别的 data type 可能会出错,这里还需要对各种数据类型进行判断
转载于:https://www.cnblogs.com/ssqhan/p/7399789.html