PostgreSQL 游标处理

PostgreSQL 游标处理,第1张

概述PostgreSQL 游标处理 简单循环处理I  此写法是先取一条数据,然后判断循环条件  -- 清空日志表.Test=# truncate table log_table;TRUNCATE TABLETest=# select * from test_main; id | value----+-------  1 | ONE  2 | TWO  4 | FOUR(3 行记录) Postgresql 游标处理

简单循环处理I


此写法是先取一条数据,然后判断循环条件



--清空日志表.Test=#truncatetablelog_table;TruncATEtableTest=#select*fromtest_main;ID|value----+-------1|ONE2|TWO4|FOUR(3行记录)CREATEORREPLACEFUNCTIONTestCursor()RETURNSvoIDAS$$DECLARE--定义游标.c_test_mainCURSORFORSELECTID,valueFROMtest_main;--定义存储数据的变量.v_IDINT;v_valueVARCHAR(10);BEGIN--打开游标.OPENc_test_main;--填充数据.FETCHc_test_mainINTOv_ID,v_value;--假如检索到了数据,才处理.whilefoundloopINSERTINTolog_tableVALUES(v_value);	--填充下一条数据.FETCHc_test_mainINTOv_ID,v_value;endloop;--关闭游标CLOSEc_test_main;END;$$LANGUAGEplpgsql;Test=#selectTestCursor();testcursor------------(1行记录)Test=#select*fromlog_table;log_text----------ONETWOFOUR(3行记录)


如果SQL语句中,列的数量很多,那么定义很多的变量,对应没一列。开发、维护成本都会比较高。这种情况下,可以采用表名%rowtype的方式,只定义一个变量来进行处理.--清空日志表.Test=#truncatetablelog_table;TruncATEtableCREATEORREPLACEFUNCTIONTestCursor()RETURNSvoIDAS$$DECLARE--定义游标.c_test_mainCURSORFORSELECTID,valueFROMtest_mainorDERBYIDDESC;--定义存储数据的变量.v_main_datatest_main%rOWTYPE;BEGIN--打开游标.OPENc_test_main;--填充数据.FETCHc_test_mainINTOv_main_data;--假如检索到了数据,才处理.whilefoundloopINSERTINTolog_tableVALUES(v_main_data.value);	--填充下一条数据.FETCHc_test_mainINTOv_main_data;endloop;--关闭游标CLOSEc_test_main;END;$$LANGUAGEplpgsql;Test=#selectTestCursor();testcursor------------(1行记录)Test=#select*fromlog_table;log_text----------FOURTWOONE(3行记录)

简单循环处理II

此写法是先开始循环,然后取数据,然后判断条件




--清空日志表.Test=#truncatetablelog_table;TruncATEtableTest=#select*fromtest_main;ID|value----+-------1|ONE2|TWO4|FOUR(3行记录)CREATEORREPLACEFUNCTIONTestCursor2()RETURNSvoIDAS$$DECLARE--定义游标.c_test_mainCURSORFORSELECTID,valueFROMtest_main;--定义存储数据的变量.v_IDINT;v_valueVARCHAR(10);BEGIN--打开游标.OPENc_test_main;LOOP--填充数据.FETCHc_test_mainINTOv_ID,v_value;--假如没有检索到数据,结束循环处理ExitwhenNOTfound;	--游标每一行的实际 *** 作.INSERTINTolog_tableVALUES(v_value);ENDLOOP;--关闭游标CLOSEc_test_main;END;$$LANGUAGEplpgsql;Test=#selectTestCursor2();testcursor2-------------(1行记录)Test=#select*fromlog_table;log_text----------ONETWOFOUR(3行记录)

支持来回滚动的游标



--清空日志表.Test=#truncatetablelog_table;TruncATEtable--为达到测试效果,多加几行测试数据.INSERTINTOtest_main(ID,value)VALUES(11,'ONEONE');INSERTINTOtest_main(ID,value)VALUES(12,'ONETWO');INSERTINTOtest_main(ID,value)VALUES(13,'ONETHREE');Test=#SELECTID,valueFROMtest_mainorDERBYID;ID|value----+----------1|ONE12|TWO14|FOUR111|ONEONE12|ONETWO13|ONETHREE(6行记录)CREATEORREPLACEFUNCTIONTestCursorScroll()RETURNSvoIDAS$$DECLARE--定义游标.c_test_mainSCRolLCURSORFORSELECTID,valueFROMtest_mainorDERBYID;--定义存储数据的变量.v_main_datatest_main%rOWTYPE;BEGIN--打开游标.OPENc_test_main;--填充数据.FETCHFirsTFROMc_test_mainINTOv_main_data;INSERTINTolog_tableVALUES('游标第一行:'||v_main_data.value);--填充数据.FETCHLASTFROMc_test_mainINTOv_main_data;INSERTINTolog_tableVALUES('游标最末行:'||v_main_data.value);--填充数据.FETCHabsolute3FROMc_test_mainINTOv_main_data;INSERTINTolog_tableVALUES('游标绝对第3行:'||v_main_data.value);--填充数据.FETCHrelative2FROMc_test_mainINTOv_main_data;INSERTINTolog_tableVALUES('游标相对第2行:'||v_main_data.value);--填充数据.FETCHPRIORFROMc_test_mainINTOv_main_data;INSERTINTolog_tableVALUES('游标上一行:'||v_main_data.value);--填充数据.FETCHNEXTFROMc_test_mainINTOv_main_data;INSERTINTolog_tableVALUES('游标下一行:'||v_main_data.value);--关闭游标CLOSEc_test_main;END;$$LANGUAGEplpgsql;Test=#selectTestCursorScroll();testcursorscroll------------------(1行记录)Test=#select*fromlog_table;log_text----------------------游标第一行:ONE1游标最末行:ONETHREE游标绝对第3行:FOUR1游标相对第2行:ONETWO游标上一行:ONEONE游标下一行:ONETWO(6行记录)



带参数的游标

这里同时需要使用前面外键约束的test_sub表



--清空日志表.Test=#truncatetablelog_table;TruncATEtableCREATEORREPLACEFUNCTIONTestCursorMainSub()RETURNSvoIDAS$$DECLARE--定义游标(主表).c_test_mainCURSORFORSELECTID,valueFROMtest_main;--保存主表游标数据的变量v_main_datatest_main%rOWTYPE;--定义游标(子表).c_test_subCURSOR(p_main_IDINT)ISSELECTID,main_ID,valueFROMtest_subWHEREmain_ID=p_main_ID;--保存子表游标数据的变量v_sub_datatest_sub%rOWTYPE;BEGIN--打开游标(主表).OPENc_test_main;--开始循环处理(主表).LOOP--填充数据(主表).FETCHc_test_mainINTOv_main_data;--假如没有检索到(主表)数据,结束循环处理ExitwhenNOTfound;--主表每一行的实际 *** 作.INSERTINTolog_tableVALUES('Main:'||v_main_data.value);--打开游标(子表).OPENc_test_sub(v_main_data.ID);--开始循环处理(子表).LOOP--填充数据(子表).FETCHc_test_subINTOv_sub_data;--假如没有检索到(主表)数据,结束循环处理ExitwhenNOTfound;--子表每一行的实际 *** 作.INSERTINTolog_tableVALUES('-->Sub:'||v_sub_data.value);ENDLOOP;--关闭游标(子表).CLOSEc_test_sub;ENDLOOP;--关闭游标(主表).CLOSEc_test_main;END;$$LANGUAGEplpgsql;Test=#selectTestCursorMainSub();testcursormainsub-------------------(1行记录)Test=#select*fromlog_table;log_text-----------------Main:ONE-->Sub:ONEONEMain:TWO-->Sub:TWOTWOMain:FOUR-->Sub:FOURFOUR(6行记录)



用于更新的游标




CREATEORREPLACEFUNCTIONTestUpdateCursor()RETURNSvoIDAS$$DECLARE--定义游标.c_test_mainCURSORFORSELECTID,valueFROMtest_mainFORUPDATE;--定义存储数据的变量.v_main_datatest_main%rOWTYPE;BEGIN--打开游标.OPENc_test_main;LOOP--填充数据.FETCHc_test_mainINTOv_main_data;--假如没有检索到数据,结束循环处理ExitwhenNOTfound;		--游标每一行的实际 *** 作.	--更新数据.UPDATEtest_mainSETvalue=value||'1'WHERECURRENTOFc_test_main;ENDLOOP;--关闭游标CLOSEc_test_main;END;$$LANGUAGEplpgsql;Test=#selectTestUpdateCursor();testupdatecursor------------------(1行记录)Test=#select*fromtest_main;ID|value----+-------1|ONE12|TWO14|FOUR1(3行记录)

FOR的使用



--清空日志表.Test=#truncatetablelog_table;TruncATEtableCREATEORREPLACEFUNCTIONTestCursorFor()RETURNSvoIDAS$$DECLARE--定义存储数据的变量.v_main_dataRECORD;BEGINFORv_main_dataINSELECTID,valueFROMtest_mainLOOP	--每一行的实际 *** 作.INSERTINTolog_tableVALUES(v_main_data.value);ENDLOOP;END;$$LANGUAGEplpgsql;Test=#SELECTTestCursorFor();testcursorfor---------------(1行记录)Test=#select*fromlog_table;log_text----------ONE1TWO1FOUR1(3行记录)
总结

以上是内存溢出为你收集整理的PostgreSQL 游标处理全部内容,希望文章能够帮你解决PostgreSQL 游标处理所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1177861.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存