postgresql 存储过程动态更新数据
-- 目标:动态更新表中数据
-- 老规矩上代码
---------------------------
--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 存储过程动态更新数据的更多相关文章
- postgresql 存储过程动态插入数据 2
最近学习postgresql,正一个小活要用上,所以就开始学习了!然而,学习的过程极其艰辛,但却也充满了乐趣. 一般来说数据库的操作不外如何增,删,改,查,而首要的就是要添加数据到数据库中,因为以前的 ...
- Android ListView动态更新数据
ListView就是可以显示一行行Item的控件,有时候数据非常多,通常需要分页显示,但为了减少用户的输入,我们可以动态更新ListView,把下一页要显示的数据的添加到当前ListView中. 先看 ...
- SQL存储过程动态查询数据区间
以前经常看到人查询数据库采用left join及case方式,一条一条的枚举查询整个数据的数据区间方法可行,但是数据一但很大,枚举就死悄悄,在网上查看,几乎全是照抄case ,left join枚举无 ...
- 【Excle】动态更新数据下拉菜单
现在我们制作了一个简单的下拉菜单,如下: 但是随着公司的逐渐扩大,部门也变得多了,目前我是把数据范围写死的 ,所有每次添加一个部门,就得修改数据范围,那么现在我们不想修改这个范围了,想让他每次添加部门 ...
- D3.js+Es6+webpack构建人物关系图(力导向图),动态更新数据,点击增加节点,拖拽增加连线...
觉得不错的麻烦加个Star:https://github.com/zhangzn3/D3-Es6 在线预览地址:https://zhangzn3.github.io/D3-Es6 功能列表:1. 增加 ...
- WPF柱状图(支持数据库动态更新)之组件的数据动态化
WPF柱状图(支持数据库动态更新) 在这片文章中我们介绍了如何将柱状图包装成一个组件,将这个组件的属性对外开放和组件的外部属性根内部属性绑定以及非轮询动态更新数据的方式. 非轮询更新数据感觉介绍的不够 ...
- Android零基础入门第67节:RecyclerView数据动态更新
列表的数据往往会跟随业务逻辑不断刷新,所呈现出来的数据需要动态更新,那么RecyclerView是如何动态更新数据的呢? 之前在学习ListView的时候如果数据改变,需要调用notifyDataSe ...
- mybatis(二)接口编程 、动态sql 、批量删除 、动态更新、连表查询
原理等不在赘述,这里主要通过代码展现. 在mybatis(一)基础上,新建一个dao包,并在里面编写接口,然后再在xml文件中引入接口路径,其他不变,在运用阶段将比原始方法更节约时间,因为不用再去手动 ...
- Hibernate动态更新
Hibernate一级缓存: Hibernate有一级和二级缓存.一级缓存就是Session. 在Hibernate启动的时候,SessionFactory解析映射文件的时候,会根据映射文件中的字段生 ...
随机推荐
- [APIO 2010] 特别行动队
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1911 [算法] 设前i个士兵"修正"后的最大战斗力为fi 令su ...
- groovy语言和grails框架
Groovy 是一种动态语言,它在 JVM 上运行,并且与 Java 语言无缝集成. Groovy 可以大大减少 Java 代码的数量.在 Groovy 中,不再需要为字段编写 getter 和 se ...
- 2018值得选用的五个Linux服务器发行版
[IT168 编译]据最新统计,目前Linux发行版约有300种,几乎都可以作为服务器系统运行.在Linux早期,几乎所有发行版都是“万能”发行版,专门的Linux服务器发行版并不火热,到21世纪初, ...
- rpm 命令|rpm 安装|rpm 卸载|rpm 使用|rpm 删除
在Linux操作系统中,有一个系统软件包,它的功能类似于Windows里面的“添加/删除程序”,但是功能又比“添加/删除程序”强很多,它就是Red Hat Package Manager(简称RPM) ...
- Flutter实战视频-移动电商-28.列表页_商品列表后台接口调试
28.列表页_商品列表后台接口调试 主要调试商品列表页的接口 这个接口是最难的因为有大类.小类还有上拉加载 先配置接口 config/service_url.dart //const serviceU ...
- 7.11实习培训日志-Git Linux
Git git子模块 先在GitHub创建两个空的respository,一个super_project和一个sub_project. 然后在git bash中向库中写入一些文件. 在super_pr ...
- cocos2dx-lua绑定之代码编辑器
转自:http://blog.csdn.net/wtyqm/article/details/9346863 享受脚本语言灵活.更新方便.免于编译的好处,但也不能忍受离开那些方便的IDE特性(跳转.自动 ...
- thinkphp5.0 cache数据缓存机制
use think\cache; public function index(){ //Cache::get('name')获取缓存,如果name值不存在则返回false: if (Cache::ge ...
- 着色语言(Shader Language)
摘抄"GPU Programming And Cg Language Primer 1rd Edition" 中文名"GPU编程与CG语言之阳春白雪下里巴人" ...
- UIWebView与JavaScript的交互
UIWebView是iOS最常用的SDK之一,它有一个stringByEvaluatingJavaScriptFromString方法可以将javascript嵌入页面中,通过这个方法我们可以在iOS ...
