【问题标题】:Join a cursor or record set in oracle在 oracle 中加入游标或记录集
【发布时间】:2010-11-08 03:43:13
【问题描述】:

我在 sybase 方面有很好的经验,并开始在空闲时间研究 oracle。 我使用过的大多数 sybase 过程都有临时表,连接两个或更多临时表得到一个结果集是有意义的。

问题: 有没有办法像逻辑表一样连接两个或多个游标。

类似:

SELECT c1.id, 
       c2.name 
  FROM cursorEmp c1, 
       CursorDept c2 
 WHERE c1.DeptId = c2.DeptId

【问题讨论】:

  • 什么版本的Oracle? IME (oracle 10g),您无法加入游标(隐式、显式或 REFCURSORS)。有了有关游标所封装内容的更多信息,您很可能根本不需要游标(或临时表)。

标签: sql oracle join database-cursor


【解决方案1】:

你不能连接两个游标,不。

当然,您可以结合两个基础查询,即

SELECT c1.id,
       c2.name
  FROM (SELECT * FROM emp WHERE ename = 'KING') c1,
       (SELECT * FROM dept WHERE dname = 'ACCOUNTING') c2
 WHERE c1.DeptID = c2.DeptID

在 Oracle 中,由于读取器不会阻塞写入器(反之亦然),因此很少需要使用临时表。您通常只需使用适当的视图来查询基础表,以提供适当的抽象级别。

【讨论】:

  • 谢谢贾斯汀,但是“读者不阻止作者”是什么意思?当执行选择时,记录不会被锁定在读取(共享)模式,拒绝对写入进程进行排他锁。
  • SELECT 不会占用任何锁(除非您执行 SELECT ...FOR UPDATE)。为了停止选择读取未提交的更改,它使用时间戳(SCN)之类的东西,并从锁定之前查找行的历史副本。
  • 谢谢你,Gary,我读了一些关于这个主题的文章,看起来共享锁定更像是一个 sybase 特性。我现在有更多问题,但在我提问之前让我搜索一下。
【解决方案2】:

Oracle 确实有自己的临时表版本(在事务或会话期间存储临时数据的永久结构) - 您可以考虑使用这些,尽管(正如贾斯汀建议的那样)您也可以将两个底层查询。

【讨论】:

  • 谢谢马克,我知道全局临时表。但我觉得它们可能会使数据库混乱。你对此有何看法?我现在有更多关于观点的问题,是时候阅读更多内容了。
  • 我没有过多地使用 Oracle 临时表,但是我没有在需要在广泛使用临时表的 SQLServer 过程和 Oracle 过程之间进行转换的环境中工作。我偶尔会在没有实际替代方案的情况下使用它们,但更频繁地我会运行组合查询,并根据需要进行提示。
猜你喜欢
  • 2012-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-04
  • 2015-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多