如果stored routines需要针对一个查询结果中的每一笔纪录执行需要的处理工作,你可以宣告一个「cursor」来代表一个查询的结果,并且使用cursor依序处理所有纪录资料。下列是在区块中宣告cursor的位置:
宣告好cursors以后,可以使用「OPEN」叙述来开启,接着使用「FETCH」叙述读取资料,最后要使用「CLOSE」叙述关闭用完的cursor:
宣告cursor时所指定的查询叙述,与使用「FETCH」读取资料时,要特别注意相对的顺序:
一般来说,都会把cursor称为「游标」或「指标」。当你宣告好一个需要的cursor以后,接着使用「OPEN」叙述开启cursor,这时会有一个游标指向查询结果的第一笔纪录:
当你使用「FETCH」叙述时,除了读取目前游标的纪录资料外,还会将游表指向下一笔纪录:
以上列宣告的cursor来说,从开启到读取所有纪录资料的游标状况会像这样:
在stored routines中使用cursor,通常需要下列的流程:
下列是流程与对应的叙述:
为了读取cursor中所有的纪录资料,要另外宣告handler来控制在没有资料读取时可以离开回圈:
除了使用「EXIT HANDLER」外,也可以使用「CONTINUE HANDLER」来控制在没有资料读取时可以离开回圈:
下列的说明表示没有资料可以读取时的流程:
在资料库的应用中,通常是需要针对一个查询的结果执行比较复杂的工作,才会在sotred routines中宣告与使用cursor。如果你常常需要查询月薪在某个金额以上的员工资料,而且要把这些员工资料储存到一个表格中。这样的需求包含执行查询与处理新表格的工作,你就可以考虑使用包含cursor的procedure来完成这些工作。
下列的范例可以将月薪在指定金额以上的员工资料储存到「cmdev.topemp」表格中: