2015-02-05 107 views
2

有没有办法来声明一个全局变量或常量,可以在块的DECLARE部分和其他地方(如C#)中使用?Oracle全局常量或变量?

我有几个脚本根据他们的操作成功在日志表上设置不同的状态。 这样我们:

UPDATE LOG_TABLE SET STATUS = ''success' WHERE OBJECT_ID = :object_id 

另外,我们有执行某些操作无法从Oracle做一个C#应用程序。此应用程序还根据其操作的成功设置了状态。

由于一些状态用于几个脚本和C#我想只在一个地方定义它们。然后从其他地方访问和使用它们。

有没有一种方法,我可以宣布类似于以后可以在PL/SQL块中使用这样的全局常量东西:

GLOBAL ORACLE CONSTANT=> MY_CONSTANT 

DECLARE 
    my_update_script VARCHAR2(300) := 'UPDATE LOG_TABLE SET STATUS = '''|| MY_CONSTANT ||''' WHERE OBJECT_ID = :object_id; 

而且还能够从C#中使用它?

+1

使用“上下文变量”。它将在所有会话中具有相同的全球价值。 – 2015-02-05 13:22:57

+2

在包规范中定义一个常量。或者创建一个函数返回一个常量(不知道后者的效率如何)。 – collapsar 2015-02-05 18:09:22

+0

@LalitKumarB我对Context变量不是很了解,但是从我正在阅读的内容来看,如果我创建了全局应用程序上下文,它将适用于整个数据库和所有用户,我是否正确? – Dzyann 2015-02-05 20:31:41

回答

1

创建全局变量的最佳方法是在包中创建它。

像:

CREATE OR REPLACE PACKAGE PKG_PARAM AS 
PROCEDURE SET_MY_CONSTANT (P_MY_CONSTANT IN VARCHAR2); 
MY_CONSTANT VARCHAR2 (30); 
END PKG_PARAM;  

您可以使用它像

my_update_script VARCHAR2(300) := 'UPDATE LOG_TABLE SET STATUS = '''|| PKG_PARAM.MY_CONSTANT ||''' WHERE OBJECT_ID = :object_id; 

你也可以通过你的包内创建过程作为更改您的变量值:

CREATE OR REPLACE PACKAGE BODY PKG_PARAM AS 
PROCEDURE SET_MY_CONSTANT (P_MY_CONSTANT IN VARCHAR2) 
IS 
BEGIN 
MY_CONSTANT := P_MY_CONSTANT; 
END; 
END PKG_PARAM; 

和然后执行你的程序:

EXEC PKG_PARAM.SET_MY_CONSTANT('ASIA');