2015-05-11 26 views
3

爲pl/sql包提供參數(配置)的首選方式是什麼? 擁有不同的環境(test,qa,prd)時,需要指定應爲每個環境適當設置的值。一旦包裝被安裝,這些值不會改變。 我正在尋找一種方法,最好讓每個環境都有相同的代碼。Oracle pl/sql提供環境特定參數的首選方式

+0

什麼樣的參數?會話級別?然後你可以使用'IF-ELSE'構造。 –

回答

3

您可以使用配置表與鍵值對。爲不同的環境插入不同的值,並將代碼中所需的這些值加載到PL/SQL變量中。

+0

+1,但請記住使用多個值列,每種類型一個。大多數人通過將所有內容保存爲字符串來實現這一點,這會在稍後導致問題 –

0

OPTION 1

使用sys_context或類似的東西。這將允許您在SQL中使用這些參數,同時不會出現性能損失。例如。看到this article得到的功能類似:

SELECT sys_context('sample_ctx','email') FROM dual 

如果您有logon觸發結合起來,你應該能夠將其設置在每一個新的會話。

OPTION 2

另一種選擇是使用這些值的全局陣列中的一些封裝的規格。該類型的數組應該是這樣的

TYPE population_type IS TABLE OF VARCHAR2(100) INDEX BY VARCHAR2(30); 

這應該在封裝體(僞代碼)內進行初始化:

PACKAGE BODY ... 
    ... -- functions etc 
BEGIN 
    -- initialization of your array 
END PACKAGE BODY; 

然後你可以使用它作爲my_params.my_array(「my_parameter 「)並直接訪問該值。

選項#2的優點是它存儲在RAM中,並且通過內置陣列閱讀器功能獲得該值。這也不需要任何特定的權限(這比方案1更好),並且在任何時候你不想讀取參數都不會讀取表格。如果你仍然喜歡將參數存儲在某個表中,那麼當會話開始時,仍然可以讀取一次(這將在程序包初始化期間自動完成)。

缺點是在SQL處理中使用數組可能會比較困難。

1

如果要修改會話級別參數,則可以在PL/SQL代碼中使用IF-ELSE構造。然後,您需要使用EXECUTE IMMEDIATE執行ALTER SESSION報表。

查找當前數據庫名稱。你可以查詢從* V $數據庫**:

SQL> SELECT name FROM v$database; 

NAME 
--------- 
ORCL 

你可以存儲在這一個局部變量,然後有一個IF-ELSE邏輯在運行時修改會話參數。

例如,

SQL> SELECT SYSDATE FROM DUAL; 

SYSDATE 
--------- 
11-MAY-15 

SQL> set serveroutput on 
SQL> DECLARE 
    2 v_db_name VARCHAR2(20); 
    3 BEGIN 
    4 SELECT NAME INTO v_db_name FROM v$database; 
    5 DBMS_OUTPUT.PUT_LINE('Current database is : '||V_DB_NAME); 
    6 IF v_db_name = 'ORCL' THEN 
    7  EXECUTE IMMEDIATE q'[alter session set nls_date_format='MM/DD/YYYY HH24:MI:SS']'; 
    8 ELSIF v_db_name = 'QA' THEN 
    9  EXECUTE IMMEDIATE q'[alter session set nls_date_format='DD/MM/YYYY HH24:MI:SS']'; 
10 ELSE 
11  EXECUTE IMMEDIATE q'[alter session set nls_date_format='DD-MON-YYYY HH24:MI:SS']'; 
12 END IF; 
13 END; 
14/
Current database is : ORCL 

PL/SQL procedure successfully completed. 

SQL> SELECT SYSDATE FROM DUAL; 

SYSDATE 
------------------- 
05/11/2015 14:24:26 

所以,你可以一個IF-ELSE塊添加到您現有的PL/SQL代碼,並在所有的環境使用相同的代碼:

IF v_db_name = 'param1' THEN 
    EXECUTE IMMEDIATE q'[alter session set parameter='value1']'; 
ELSIF v_db_name = 'param2' THEN 
    EXECUTE IMMEDIATE q'[alter session set parameter='value2']'; 
ELSE 
    EXECUTE IMMEDIATE q'[alter session set parameter='value3']'; 
END IF; 

要在所有軟件包中全局使用參數值,您可以查看global context variable

相關問題