代码之家  ›  专栏  ›  技术社区  ›  Präriewolf

pl/sql包表

  •  3
  • Präriewolf  · 技术社区  · 17 年前

    我需要在PL/SQL应用程序中维护状态。会议期间,它需要放一张小桌子。

    据我所知,这是通过一个包变量完成的,但我不知道如何将表创建为包变量。

    有人解释如何做到这一点或其他选择吗?

    问题扩展:
    我有一个 WHERE IN 在运行时必须填充到光标中的条件。因为据我所知,我只能用硬编码文字或 SELECT 我要把所有的 IN's 在会话期间由用户选择的。

    4 回复  |  直到 9 年前
        1
  •  5
  •   darreljnz    17 年前

    在包中定义具有表类型的变量。如果希望从包外部访问状态,则在头中定义该状态-如果希望它是私有的,则在主体中定义该状态。

    如果要在第一次访问包时初始化变量,请使用包底部的初始化块。

    一些提示:

    • 使用初始化块时,请小心处理异常。如果出现异常,则需要确保使用清除错误消息或日志消息。维护程序员解决问题可能直接跳到被调用的方法来解决问题,而不是检查隐式初始化块。
    • 在清除包级别变量的各种情况下,Oracle可以将包移入和移出内存。确保您的状态仅对该会话是必需的,并且该会话相当短(即几天内不在)。如果您需要更可靠的持久性,那么使用物理表,而不是包变量。
    • 我经常发现一个问题,开始是适合于一个包级别的表,随着时间的推移,通常会变得更复杂。从可扩展性的角度来看,使用真正的表可能更好。这取决于你是在为一个简单的问题寻找一个短期的解决方案,还是为一个关键任务的问题寻找一个长期的解决方案,还是一个将随着时间而发展的问题。

    使用简单的“名称值”映射表的示例:

    create or replace package bob as
      procedure do_stuff;
    end bob;
    
    create or replace package body bob as
      type my_table is table of varchar2(100) index by varchar2(100);
      my_variable my_table;
    
    procedure do_stuff
    begin
      --do stuff to my_variable
    end;
    
    begin
      --initialise my_variable
    end bob;
    
        2
  •  2
  •   akf    17 年前

    如果需要在应用程序中维护状态,可以在全局表中这样做,就像在包级别表中那样容易。不同的是,包表在包外部是不可访问的。

    From O'Reilly ,我们看到在 PACKAGE 规范被认为是全局的,但在 PACKAGE BODY 规范是一个包级别的变量。

        3
  •  1
  •   Greg    17 年前

    设置为“提交时保留行”的全局临时表(设置为键/值)有助于在整个会话中使用这些值,而不仅仅是在包中。然后,可以使用键access在表的in或exist子句中构建SQL查询。