gpt4 book ai didi

oracle - PL/SQL 包表

转载 作者:行者123 更新时间:2023-12-02 09:05:09 26 4
gpt4 key购买 nike

我需要维护 PL/SQL 应用程序中的状态。 session 期间需要保留一张小 table 。

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

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

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

最佳答案

您可以在包中定义一个具有表类型的变量。如果您希望从包外部访问状态,则可以在 header 中定义它 - 如果您希望它是私有(private)的,则可以在主体中定义它。

如果您想在第一次访问包时初始化变量,则可以使用包底部的初始化 block 。

一些提示:

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

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

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;

关于oracle - PL/SQL 包表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1330219/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com