db2中cursor的语法
.-NO SCROLL------------------------.
>>-DECLARE--cursor-name--+----------------------------------+---> ......
| .-ASENSITIVE------------. |
'-+-----------------------+-SCROLL-'
+-INSENSITIVE-----------+
| .-DYNAMIC-. |
'-SENSITIVE-+---------+-'
'-STATIC--'
而在Oracle中,只有"scroll"是支持的,别的都不支持。而且,对于"scroll"也仅仅是在嵌入式sql中支持,而在pl/sql中不支持。
说说scroll吧:
没有scroll的时候,cursor打开后就是第一条数据;然后可以逐条顺序的向后访问,直到结束。
有了scroll,cursor就支持随机访问了。first/last/next/previous,甚至于指定一个位置 absolute/relative。这就很灵活。
再说说sensitive/insensitive吧:
有这样一种情况,cursor打开后,假设里面有n条记录;恰巧在访问cursor的过程当中,这n条记录发生了改变。那么,在后续的cursor的访问中,新的改变是否体现在crusor中呢?
Oracle是不支持这个的。也就是说,Oracle中的cursor就像快照一样。我做了类似的测试,发现外面的修改不会影响cursor里面的数据。
DB2很灵活,通过指定"sensitive"来使能这个特性。这样,外面的修改就能体现在cursor里面的数据上了。
这么做是否必要呢?我觉得即便使能了,在访问cursor里面的数据的时候,也可能访问不到新的数据;比如下面的情况(我没验证过,猜测而已):
1. 打开cursor,包含A/B/C一共3条数据。
2. 访问cursor中的数据A.
3. 此时,外部程序修改了A.
4. 继续访问cursor中剩余的2条数据.
显然,A的修改不会被访问cursor的程序捕获到。
带上"sensitive",只能说一定程度上可以让外面的修改体现在cursor中的数据上。
我的理解比较粗浅,而且没有在db2上做任何测试。
如有不对,欢迎指正。
Some useful links:
========== db2
Sensitive/insensitive/scroll cursor
https://www.ibm.com/support/knowledgecenter/en/SSEPEK_10.0.0/apsg/src/tpc/db2z_typecursor.html
========== oracle
These are for pl/sql:
There’s no key word “scroll” in cursor declaration statement
https://docs.oracle.com/database/121/LNPLS/explicit_cursor.htm#GUID-38C5DBA3-9DEC-4AF2-9B5E-7B721D11A77C__CJAEHJBH
There’s no key word “last/absolute” in fetch statement.
This is for embedded sql
It support “scroll cursor”.
https://docs.oracle.com/cd/E11882_01/appdev.112/e10826/pco05sql.htm#LNPCB005
A discussion about the “sensitive scroll cursor”
https://stackoverflow.com/questions/1690822/do-database-cursors-pick-up-changes-to-the-underlying-data
阅读(3131) | 评论(0) | 转发(0) |