-- 目标:动态更新表中数据
-- 老规矩上代码
---------------------------
--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 可能会出错,这里还需要对各种数据类型进行判断

postgresql 存储过程动态更新数据的更多相关文章

  1. postgresql 存储过程动态插入数据 2

    最近学习postgresql,正一个小活要用上,所以就开始学习了!然而,学习的过程极其艰辛,但却也充满了乐趣. 一般来说数据库的操作不外如何增,删,改,查,而首要的就是要添加数据到数据库中,因为以前的 ...

  2. Android ListView动态更新数据

    ListView就是可以显示一行行Item的控件,有时候数据非常多,通常需要分页显示,但为了减少用户的输入,我们可以动态更新ListView,把下一页要显示的数据的添加到当前ListView中. 先看 ...

  3. SQL存储过程动态查询数据区间

    以前经常看到人查询数据库采用left join及case方式,一条一条的枚举查询整个数据的数据区间方法可行,但是数据一但很大,枚举就死悄悄,在网上查看,几乎全是照抄case ,left join枚举无 ...

  4. 【Excle】动态更新数据下拉菜单

    现在我们制作了一个简单的下拉菜单,如下: 但是随着公司的逐渐扩大,部门也变得多了,目前我是把数据范围写死的 ,所有每次添加一个部门,就得修改数据范围,那么现在我们不想修改这个范围了,想让他每次添加部门 ...

  5. D3.js+Es6+webpack构建人物关系图(力导向图),动态更新数据,点击增加节点,拖拽增加连线...

    觉得不错的麻烦加个Star:https://github.com/zhangzn3/D3-Es6 在线预览地址:https://zhangzn3.github.io/D3-Es6 功能列表:1. 增加 ...

  6. WPF柱状图(支持数据库动态更新)之组件的数据动态化

    WPF柱状图(支持数据库动态更新) 在这片文章中我们介绍了如何将柱状图包装成一个组件,将这个组件的属性对外开放和组件的外部属性根内部属性绑定以及非轮询动态更新数据的方式. 非轮询更新数据感觉介绍的不够 ...

  7. Android零基础入门第67节:RecyclerView数据动态更新

    列表的数据往往会跟随业务逻辑不断刷新,所呈现出来的数据需要动态更新,那么RecyclerView是如何动态更新数据的呢? 之前在学习ListView的时候如果数据改变,需要调用notifyDataSe ...

  8. mybatis(二)接口编程 、动态sql 、批量删除 、动态更新、连表查询

    原理等不在赘述,这里主要通过代码展现. 在mybatis(一)基础上,新建一个dao包,并在里面编写接口,然后再在xml文件中引入接口路径,其他不变,在运用阶段将比原始方法更节约时间,因为不用再去手动 ...

  9. Hibernate动态更新

    Hibernate一级缓存: Hibernate有一级和二级缓存.一级缓存就是Session. 在Hibernate启动的时候,SessionFactory解析映射文件的时候,会根据映射文件中的字段生 ...

随机推荐

  1. Subset Sums

    链接 分析:dp[i][j]表示前i个数能够组成j的对数,可得dp[i][j]=dp[i-1][j]+dp[i-1][j-i],所以最后dp[n][sum/2]既是所求 /* PROB:subset ...

  2. c++之cin/cin.get/cin.getline()详解

    C++输入过程中,是把输入加载到缓冲区中,然后对缓冲区中的字符进行读取.cin,cin,get(),cin.getline()三个函数虽然都能进行数据读取,但是它们对缓冲区内数据的处理方法是不同的(如 ...

  3. 2.CSS 颜色代码大全

    确实使用,不用重复造轮子了!!! 摘自:http://www.cnblogs.com/circlebreak/p/6140602.html

  4. C语言指针入门知识

    C语言指针往往是C语言学习过程中最困难的地方, 最近重新理解了一下C语言的指针知识, 在此整理一下, 如果有错误请留言指正. 对于刚入门的人来说, 指针涉及方方面面, 从简单的数组到结构体, 都会用到 ...

  5. 20个Flutter实例视频教程-第07节: 毛玻璃效果制作

    视频地址: https://www.bilibili.com/video/av39709290/?p=7 博客地址: https://jspang.com/post/flutterDemo.html# ...

  6. 【转】Maven 入门

    [转]http://www.blogjava.net/jiangshachina/archive/2006/09/01/67080.html   Maven入门--概念与实例  最近由于工作原因在研究 ...

  7. E20180512-hm

    travesal n. 横越,横断物,(横向)往返移动;

  8. 洛谷P3960 列队(Splay)

    传送门 感觉自己好久不打数据结构已经完全不会了orz…… 据说正解树状数组?然而并不会 首先考虑一下每一次操作,就是把一个人从这一行中取出并放到行的最后,再从最后一列取出放到列的最后 那么这两种操作其 ...

  9. [HNOI2010] 合唱队 chorus

    标签:区间DP.题解: 首先分析题目,根据题目中的列队方式以及数据范围,我们容易想到O(n2)的算法,也就是区间DP.发现直接dp[L][R],不能转移,于是添加一个dp[L][R][0/1],0表示 ...

  10. [Xcode 实际操作]八、网络与多线程-(16)使用网址会话对象URLSession下载图片并显示下载进度

    目录:[Swift]Xcode实际操作 本文将演示如何通过网址会话对象URLSession显示下载图片的进度. 网址会话对象URLSession具有在后台上传和下载.暂停和恢复网络操作.丰富的代理模式 ...