PL / SQL - 调用包过程的新实例

时间:2016-12-08 10:16:22

标签: oracle plsql

我有使用全局变量的包。 从我需要调用的其中一个程序" new instance" od另一个程序(同一个程序包)。我需要第二个程序来使用它自己的全局变量版本,当它完成时我需要第一个程序来使用之前的变量。 我做了一个快速而肮脏的修复,在第二个过程开始时,我创建备份变量并将全局变量值放入其中,然后将全局变量设置为NULL,最后我将备份值放回全局变量。 但我希望有比这更好的解决方案,一种启动该过程/包的新实例的方法

修改

详细方案如下: 包有多个过程和函数,它们使用在包级别定义的变量。我调用包的第一个过程,该过程调用当前操作所需的所有内容。在某些情况下,从第二个程序开始,我需要启动必须执行的新任务(动作)。在那种情况下,我想重新开始第一个程序包,但是要使用它自己的全局变量(不要弄乱原始变量),因为原始程序尚未完成,仍然需要它的变量 一些包全局变量是自定义类型(确切地说是custom_type表),因此它给我带来了额外的问题。

希望现在清楚我有什么问题以及我想做什么 所以它就是这样的

Package 1
 global_var 1
 global_var 2
 global_var 3

 Procedure 1
     some code
     call to function 1
     some code
     call to procedure 2
     and so on...
 Procedure 2
     some code
     call function 3
     some code
     call to procedure 1 (start new process)
     some code
     call procedure 3
     and so on....
 Procedure 3
 Procedure 4
 Function 1
 Function 2
 Function 3
 Function 4

变量就像这样

type type1 is record (x NUMBER, y VARCHAR2(1024), z NUMBER);
type type2 is table of type1;

global_var_1 NUMBER;
global_var_2 type2;
...

1 个答案:

答案 0 :(得分:1)

在阅读完整篇文章后(附加说明),我得出的结论是,您的问题始于对所需流程的错误构思。实际上(并借助其他编程语言的文字),您需要使用自己的数据上下文来生成新线程。

我看到两种可能的解决方案(在Oracle中):

  1. 在JAVA中编写您的包(这里我假设此选项允许创建线程,但从未检查过它),

  2. 不要使用GLOBAL VARIABLES。

  3. 对于第一种选择,我没有太多话要说,除非您可能值得进一步调查。

    至于第二个选项,你可以(很容易):

    1. 定义一个包级别的类型,它将包含您当前在全局级别使用的所有变量,并且:

    2. 在包中添加一个新类型的参数(我将它作为最后一个),默认值为NULL。在需要的地方,新参数的定义可以设置为IN OUT(对于结构中的一个或多个字段在函数内更新并且更新需要“冒泡”到调用的情况码)。

    3. 现在,让我们分析两个场景(第一次调用FIRST过程和第二次从包中调用):

      1. 第一次调用(来自外部包):新参数将为空(NULL),并且该过程将指定在其他函数/过程的其他调用中级联所需的任何值

      2. 第二次调用(来自 包中):可以为新参数包含非NULL值(取决于您的需要);然后,代码将能够准备一组新的值(对于上述类型的新变量),然后通过其他函数和过程的其他调用进行级联。

      3. 这种方法可以实现您所需要的(尽管我可以想象)所需的代码更改将是最小的。

        希望这能解决您发布的问题,并且建议的方法可以为您提供良好的服务。