postgresql 存储过程动态更新数据

Posted 物来顺心,事去宁心!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 存储过程动态更新数据的主要内容,如果未能解决你的问题,请参考以下文章

在 python 烧瓶中使用空格动态更新 postgresql 表数据

mySQL 使用动态列名的过程更新行

postgresql 存储过程的事务处理

简化动态MERGE的SQL计算

SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Sybase(代码片

JPA 和 PostgreSQL:如何调用具有 void 返回类型的存储过程?