我一直在研究SQL Server很长一段时间,最近我被转移到了一个使用Oracle的项目。
虽然我听说过术语Cursor
,但我没有在SQL Server中遇到过一个。所以我的问题是:
Cursor
? (或者在什么情况下你真的需要cursor
?)cursor
是强制性的?答案 0 :(得分:2)
为什么你甚至不在SQL Server中声明Cursor? (或者在什么情况下你实际上需要光标?)任何时候你都不需要通过记录处理来进行基于集合的处理记录;那么你需要使用一个游标。在事务中,基于集合的逻辑是全有或全无的。也许我正在处理个人记录,而且我愿意接受部分工作的情况。在这种情况下,我可以单独管理每个记录99%完成并且有一个"失败"写出日志。但是通常这也可以通过基于集合的逻辑来完成,如果有人认为的话。
为什么声明游标在Oracle中是强制性的? 与直接返回数据集的SQL服务器不同,Oracle通过包,过程和函数从REF CURSOR返回数据集。因此,如果要使用数据集,则必须使用REF游标。
答案 1 :(得分:1)
Cursor
返回光标打开时的一致数据。
为了显示这一点,我将打开一个光标,然后我将更改一行,我将比较数据库和光标的结果:
SQL> conn hr/hr
Connected.
SQL> select employee_id, email from employees;
EMPLOYEE_ID EMAIL
----------- -------------------------
100 SKING
101 NKOCHHAR
...
205 SHIGGINS
206 WGIETZ
107 rows selected.
SQL> var rc refcursor
SQL> ed
Wrote file afiedt.buf
1 begin
2 open :rc for
3 select employee_id
4 , email
5 from employees
6 order by 1;
7* end;
SQL> /
PL/SQL procedure successfully completed.
SQL> update employees set email = 'xxxxxx' where employee_id = 206;
1 row updated.
SQL> commit;
Commit complete.
SQL> print rc
EMPLOYEE_ID EMAIL
----------- -------------------------
100 SKING
101 NKOCHHAR
...
205 SHIGGINS
206 WGIETZ
107 rows selected.
SQL> select employee_id, email from employees;
EMPLOYEE_ID EMAIL
----------- -------------------------
100 SKING
101 NKOCHHAR
...
205 SHIGGINS
206 xxxxxx
107 rows selected.
正如您所见,光标具有光标打开时数据库中的数据。这是非常重要的行为,假设您想要使用银行帐户,例如,您想要计算总和。如果有人更改了表数据,您将获得一致的数据,无论如何您都会得到正确的答案。
答案 2 :(得分:0)
有多种情况需要在sql server中使用游标,它们可能与oracle中的相同。例如,如果您需要为数据集的每一行调用存储过程,则需要使用游标,因为您不能使用"常规"查询。