【问题标题】:Oracle-Should I use temp table or ref cursorOracle-我应该使用临时表还是引用游标
【发布时间】:2015-01-02 07:32:11
【问题描述】:

我有以下场景,我必须为此编写一个存储过程:

  1. 包含 invoice_ID 和 invoice_line_ID 的表头
  2. 地址行表包含 invoice_line_id 以及与抬头表中每个 invoice_line_ID 对应的“Ship_From”和“Ship_To”。 3.地址头表包含invoice_ID和头表中每个invoice_id对应的'Ship_From'和'Ship_To'。

在这种情况下,并非所有“Ship_From”和“Ship_To”信息都会出现在地址行表中。在这种情况下,需要从 Address Header 表中选择信息。

所以我将编写一个案例结构和两个连接: 1. 这将连接 Header 表和 Address Line 表 2. 这将连接 Header 表和 Address Header 表。 如果行表中没有特定 invoice_line_id 的全部信息,则条件是进行第二次连接。

我的问题是我应该在哪里存储信息?我将使用游标来执行上述案例结构。但是在这种情况下我应该使用参考游标还是临时表?

请注意,我的客户不喜欢数据库中存在额外数据库对象的想法,因此我可能必须在完成显示后删除临时表。我需要这方面的帮助,以及是否有任何替代临时表或引用游标是否占用数据库上的额外空间。

【问题讨论】:

    标签: database oracle join


    【解决方案1】:

    在您的情况下,您不应该使用临时表。这种表与普通表没有太大区别。它是一个对象,始终存在于数据库中。如果您想每次都创建和删除它,则需要解决许多问题。如果两个用户同时使用一个数据库,您需要检查它是否已经由另一个用户创建。或者您需要确保每个用户都将创建一个具有唯一名称的表。您需要一种机制来删除未正确删除的表,例如,当用户会话由于网络问题中止时。以及许多其他问题。这不是使用 oracle 临时表的方法。

    UPD

    关于引用。

    declare
      my_cursor sys_refcursor;
      num number;
    begin
      open my_cursor for select rownum from dual;
    
      loop
        fetch my_cursor into num;
        exit when my_cursor%notfound;
        -- do something else
      end loop;
    end;
    /
    

    这是一个使用游标的简单示例。至于我,它比临时表更适合您的情况。

    【讨论】:

    • 引用游标和临时表一样吗?有没有办法像在临时表中那样在引用游标中插入记录?
    • 您不会将记录插入到 refcursor - 您选择它们​​。这是主要区别。 refcursor 中的数据始终位于内存中。 Refcursor 本身只是一个包中的几行代码,在代码执行过程中它是内存段上的一个链接。
    • 所以在这种情况下它必须是临时表,因为如果我必须遍历每个 line_id 以检查每个标题和行中的信息,就没有其他方法可以将记录放在一起地址表,你能建议我在这里使用的任何其他数据库对象吗?
    • 我更新了我的答案。有许多数据库对象可供您使用:视图、物化视图、游标、临时表、普通表。至于我,我想在你的地方选择游标或视图。
    猜你喜欢
    • 1970-01-01
    • 2018-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 2011-12-06
    • 2016-02-06
    相关资源
    最近更新 更多