哪个更适合从oracle数据库返回结果集=>参考。 Cursor vs Select sql语句

时间:2015-08-04 11:50:51

标签: oracle

我已经谷歌搜索了一段时间来找到一个替代方法来返回结果集而不是返回一个引用游标但却找不到它。因为我在sql server中完成了大部分开发工作,除非有必要,否则我们不会使用游标,但我明白它与ref不同。光标。但最重要的是,当我们返回参考时。游标作为数据库的输出,它将成为一个连接的架构。所以我亲爱的极客可以回答/清除我下面提到的混淆,

  1. 我想了解哪种方法可以将结果集返回给我们的应用程序(参考游标或SELECT语句包含所有连接或任何其他选项)?

  2. 正在使用ref。 cursor是一个连接/断开的架构?

  3. 使用Select sql查询更适合断开连接的方法吗?

  4. 提前致谢。

3 个答案:

答案 0 :(得分:2)

像往常一样,这取决于您的需求。

关于连接/断开的架构,它几乎没有区别。在客户端应用程序收到RefCursor并获取所有行(并且最好关闭游标)之后,您可以使用与使用直接SELECT语句相同的方式断开连接并重新连接数据库。

考虑以下伪代码示例:

SELECT EMP_NAME, DEPT_NAME  
FROM EMP
    JOIN DEPT ON EMP_DEPT_ID = DEPT_ID
WHERE DEPT_ID = :d;

vs. 

CREATE FUNCTION GetEmps(deptId IN NUMBER) RETURN SYS_REFCURSOR IS
   res SYS_REFCURSOR;
BEGIN
   OPEN res FOR
   SELECT EMP_NAME, DEPT_NAME  
   FROM EMP
       JOIN DEPT ON EMP_DEPT_ID = DEPT_ID
   WHERE DEPT_ID = deptId;
   RETURN res;
END;

我个人最喜欢的是选择RefCursors,因为:

  • 使用RefCursor客户端和服务器彼此更加分离,即客户端只需要知道函数名称以及他收到的属性(EMP_NAMEDEPT_NAME),没有别的。他不必知道表名或任何连接条件。客户端和服务器的开发人员可以相互独立地工作。
  • 使用RefCursor,您可以实现细粒度安全方法。您只需执行grant execute on GetEmps to ...,客户就可以获得EMP_NAME和DEPT_NAME - 不多也不少! 使用直接SELECT,您必须在两个表上授予select,但是客户端也可以执行SELECT SALARY, EMP_NAME FROM EMP;例如(除非您使用Oracle中非常昂贵的VPD功能)。如果您愿意,可以记录该函数的每个调用,并添加任意数量的约束。
  • 使用RefCursor,客户端应用程序(而不是服务器)可以决定他想要获取多少行以优化响应时间。

答案 1 :(得分:0)

基本区别在于,当您不确定要在运行时执行的sql查询时,请使用引用游标,并且可以对不同的sql查询使用相同的引用游标。例如 查询

select name,id,dob from table where id=:v_id;

这里v_id是在运行时传递的,所以我们可以使用ref cursor。 v_id在运行时变化。

当我们有一小组记录时,select语句用于每个循环。当我们有大量记录时,我们可以使用批量收集与ref游标和限制行。

答案 2 :(得分:0)

在Oracle中,所有DML语句都是游标。游标只是优化器用来获取数据的一组指令。

在我以Oracle为中心的观点中,数据库中所做的一切都应该在存储过程中完成,这样你就可以在数据库中拥有一个中央接口 - 即。如果你有两个应用程序更新/从同一个数据库检索数据,你只需要在数据库上有一组存储过程,而不是在每个应用程序中复制两次逻辑。

考虑到这一点,ref游标是可行的方法。

但是,如果你没有沿着那条路走下去(boo!* {;-)),那么在将数据传递到前端方面,引用光标和直接选择语句之间几乎没有区别。当然,如何调用数据会有所不同,但对数据库来说却是一样的。

所有引用游标都基本上保存了一个指向游标的指针。