为什么在SQL Server中使用Cursor?

时间:2014-07-28 14:24:18

标签: sql sql-server oracle

我一直在研究SQL Server很长一段时间,最近我被转移到了一个使用Oracle的项目。

虽然我听说过术语Cursor,但我没有在SQL Server中遇到过一个。所以我的问题是:

  1. 为什么你甚至在SQL Server中声明Cursor? (或者在什么情况下你真的需要cursor?)
  2. 为什么在Oracle中声明cursor是强制性的?

3 个答案:

答案 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中的相同。例如,如果您需要为数据集的每一行调用存储过程,则需要使用游标,因为您不能使用"常规"查询。