PL/SQL包表

Prä*_*olf 3 oracle plsql

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

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

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

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

dar*_*jnz 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;
Run Code Online (Sandbox Code Playgroud)