-- 目標:動態更新表中數據 -- 老規矩上代碼
---------------------------
--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 可能會出錯,這里還需要對各種數據類型進行判斷