我有使用全局变量的包。 从我需要调用的其中一个程序" 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;
...
答案 0 :(得分:1)
在阅读完整篇文章后(附加说明),我得出的结论是,您的问题始于对所需流程的错误构思。实际上(并借助其他编程语言的文字),您需要使用自己的数据上下文来生成新线程。
我看到两种可能的解决方案(在Oracle中):
在JAVA中编写您的包(这里我假设此选项允许创建线程,但从未检查过它),
不要使用GLOBAL VARIABLES。
对于第一种选择,我没有太多话要说,除非您可能值得进一步调查。
至于第二个选项,你可以(很容易):
定义一个包级别的类型,它将包含您当前在全局级别使用的所有变量,并且:
在包中添加一个新类型的参数(我将它作为最后一个),默认值为NULL。在需要的地方,新参数的定义可以设置为IN OUT
(对于结构中的一个或多个字段在函数内更新并且更新需要“冒泡”到调用的情况码)。
现在,让我们分析两个场景(第一次调用FIRST过程和第二次从包中调用):
第一次调用(来自外部包):新参数将为空(NULL),并且该过程将指定在其他函数/过程的其他调用中级联所需的任何值
第二次调用(来自 包中):可以为新参数包含非NULL值(取决于您的需要);然后,代码将能够准备一组新的值(对于上述类型的新变量),然后通过其他函数和过程的其他调用进行级联。
这种方法可以实现您所需要的(尽管我可以想象)所需的代码更改将是最小的。
希望这能解决您发布的问题,并且建议的方法可以为您提供良好的服务。