我需要在PL / SQL应用程序中维护状态。它需要在会议期间举行一个小桌子。
据我了解,这是通过包变量完成的,但我不知道如何将表创建为包变量。
任何人都解释如何做到这一点或替代方案?
扩展问题:
我有一个WHERE IN
条件,我必须在运行时填充光标。据我所知,我只能使用硬编码的文字填充它或SELECT
我需要保存用户在会话期间选择的所有IN's
。
答案 0 :(得分:5)
您可以在包中定义具有表类型的变量。如果您希望从包外部访问该状态,则可以在标题中定义 - 如果您希望它是私有的,那么您可以在正文中定义它。
如果要在第一次访问包时初始化变量,则使用包底部的初始化块。
一些提示:
使用简单的“名称 - 值”映射表的示例:
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)