zoukankan      html  css  js  c++  java
  • 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 可能会出错,这里还需要对各种数据类型进行判断

  • 相关阅读:
    图的概念、存储、遍历、最短路径问题、最小生成树、拓扑排序、关键路径
    Nginx负载均衡
    Nginx反向代理
    Nginx配置虚拟主机
    Linux下Nginx安装
    freemarker使用
    ActiveMQ与spring整合
    ActiveMQ安装
    全局异常处理
    solr整合spring
  • 原文地址:https://www.cnblogs.com/ssqhan/p/7399789.html
Copyright © 2011-2022 走看看