PL / SQL包表

时间:2009-08-25 18:47:25

标签: oracle plsql

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

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

任何人都解释如何做到这一点或替代方案?

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

4 个答案:

答案 0 :(得分:5)

您可以在包中定义具有表类型的变量。如果您希望从包外部访问该状态,则可以在标题中定义 - 如果您希望它是私有的,那么您可以在正文中定义它。

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

一些提示:

  • 使用初始化块时要小心异常处理。如果出现异常,则需要确保使用明确的错误消息或日志消息。对问题进行故障排除的维护程序员可以直接跳转到被调用的方法进行故障排除,而不是检查隐式初始化块。
  • 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;

答案 1 :(得分:2)

如果需要在应用程序中维护状态,则可以在全局表中执行此操作,就像包级别表一样容易。不同之处在于无法在包外部访问包表。

From O'Reilly,我们看到PACKAGE规范中定义的表被认为是全局的,但PACKAGE BODY规范中声明的表是包级变量。

答案 2 :(得分:1)

设置为提交保留行的GLOBAL TEMP TABLE设置为键/值可以帮助在整个会话中使用值,而不仅仅是在包中。然后可以围绕IN或EXIST子句构建SQL查询,并使用密钥访问表。

答案 3 :(得分:0)