Oracle序列与游标
我是一名SQL用户,试图理解下面的Oracle游标代码 我知道第一个块是从id_seq获取当前序列号到id。但是第二个街区在干什么 特别是这一行-如果c3%未找到或c3_rec.id为空,那么c3未找到和c3_rec.id为空的含义是什么Oracle序列与游标,oracle,cursor,sequence,Oracle,Cursor,Sequence,我是一名SQL用户,试图理解下面的Oracle游标代码 我知道第一个块是从id_seq获取当前序列号到id。但是第二个街区在干什么 特别是这一行-如果c3%未找到或c3_rec.id为空,那么c3未找到和c3_rec.id为空的含义是什么 卢克的评论是正确的。最后一行表示如果没有找到记录,或者如果列id的值为空,则。。。等等 在这种情况下,我认为这条线是多余的。光标选择序列id_seq的CURRVAL,该值是使用NEXTVAL在当前会话中最近选择的值 也许我遗漏了什么,但我只看到了以下可能性:
卢克的评论是正确的。最后一行表示如果没有找到记录,或者如果列id的值为空,则。。。等等 在这种情况下,我认为这条线是多余的。光标选择序列id_seq的CURRVAL,该值是使用NEXTVAL在当前会话中最近选择的值 也许我遗漏了什么,但我只看到了以下可能性: 如果id_seq不存在,则在 游标被声明 如果id_seq存在,但未在中引用有效的NEXTVAL 在当前会话中,光标移动后将立即引发异常 打开了。如果NEXTVAL超过序列的值,则它将无效 最大值 如果有效id_seq.NEXTVAL已在当前 会话中,CURRVAL将是的最新有效值 下一步
如果代码一直执行到最后一行,而没有出现错误,那么我们已经知道找到了一条记录。c3_rec.id是序列当前值及其增量的两个整数之和,因此不能为空。因此,这句话对我来说是多余的。我不是甲骨文专家,但通过快速的谷歌搜索发现了这一点。第一个块只是定义光标。第二个是打开它并将数据提取到c3_rec中。如果光标未返回任何记录或返回的记录没有id,则…序列与会话无关,所有值都在数据库级别。在Oracle 12c中,您可以在会话级别定义序列,但是默认用法是在数据库级别。序列本身是会话独立的,但sequence.CURRVAL不是。如果我的会话的NEXTVAL为1,那么您的会话将从同一序列中再获得四个NEXTVAL,您的CURRVAL将为5,我的CURRVAL仍然为1。我们的下一轮比赛都是6岁。
CURSOR c3 IS
SELECT id_seq.CURRVAL id
FROM dual;
OPEN c3;
FETCH c3 INTO c3_rec;
IF c3%NOTFOUND OR c3_rec.id IS NULL THEN