Oracle数据库游标使用的时候,有几个地方是需要注意的。如果你在使用游标的时候报错了,找了半天没找到原因。那么这篇文章就是写给你的。
首先简单介绍一下Oracle中的游标类型有哪些:显式游标、隐式游标、REF强类型游标、REF弱类型游标。
现在来介绍一下易错的地方:
1.普通游标才能使用FOR循环
for..in循环是一种很方便遍历游标的方法,但这种循环只能用在普通游标类型,也就是只能用在显式游标、和隐式游标。原因是因为FOR循环会自动打开游标、自动关闭游标。但是REF类型游标是在打开的时候绑定需要查询的表的。也就是因为这样的冲突所以不能使用for循环来遍历REF游标。同时提醒一下,FOR循环中的游标转储变量不用声明也可以的。它的类型是%ROWTYPE类型的。有些人会错在这个细节上。
显式游标使用FOR循环遍历:
隐式游标使用FOR循环遍历:
2.REF强类型游标与弱类型游标的区别就在于有没有return 数据类型(有没有声明返回值类型),这个返回值类型必须是游标绑定的那张表的记录变量类型,也就是ROWTYPE类型。
在使用上,有时候声明了返回值反而会报错,具体怎样的错,笔者现在已经记不得了。但是如果你在使用REF游标的时候报错了,试试看删除返回值类型。反正声明不声明都是一样的。笔者那次就真的是这个问题弄了半天。
3.使用存储过程返回一个游标的时候,游标绑定的表是设计复杂的一些列子查询、连接等,总之不是原表查询。那么在调用的过程中,要注意这么几点:第一,游标转储变量不能是ROWTYPE类型的,只能是type类型的。因为查询出来的表的名称无法获取,及时起了别名,也是不行的。只能在存储过程中,写的时候,将要返回的字段一个一个列出来,调用的时候一个一个的接收。这里有一个分页查询的范例:
4.如果以上两点都没能帮你找出问题,那么还有一个很实用的方法。就是按照游标的基本语法,试着先写出各种游标的例子,或许你就会顿悟,哦,原来就是这个原因。这招不单指在这里,在很多时候没有头绪的情况下,都会很有用。