Oracle—全局變量


Oracle全局變量

一、數據庫程序包全局變量
      在程序實現過程中,經常用遇到一些全局變量或常數。在程序開發過程中,往往會將該變量或常數存儲於臨時表或前台程序的全局變量中,由此帶來運行效率降低<頻繁讀取臨時表>或安全隱患<存於前台程序變量,可跟蹤內存變量獲得>。
      本節主要論述將全局變量或常數存取程序包的優點和實現方法。

1、優點
    (1)執行效率比存儲於臨時表高,不需要頻繁存取臨時表。
    (2)將全局變量藏於最后防線<數據庫>,安全性較高。
    (3)在視圖中可以調用程序包的變量,實現動態視圖。

2、實現方法
實例:

    --定義程序包 
  create or replace package PKG_System_Constant is 
   
    C_SystemTitle nVarChar2(100):='測試全局程序變量'; --定義常數 
    --獲取常數<系統標題> 
    Function FN_GetSystemTitle 
     Return nVarChar2; 
   
    G_CurrentDate Date:=SysDate; --定義全局變量 
    --獲取全局變量<當前日期> 
    Function FN_GetCurrentDate 
     Return Date; 
    --設置全局變量<當前日期> 
    Procedure SP_SetCurrentDate 
     (P_CurrentDate In Date); 
  End PKG_System_Constant; 
  / 
  create or replace package body PKG_System_Constant is 
    --獲取常數<系統標題> 
    Function FN_GetSystemTitle 
     Return nVarChar2 
     Is 
     Begin 
       Return C_SystemTitle; 
     End FN_GetSystemTitle; 
   
    --獲取全局變量<當前日期> 
    Function FN_GetCurrentDate 
     Return Date 
     Is 
     Begin 
       Return G_CurrentDate; 
     End FN_GetCurrentDate; 
    --設置全局變量<當前日期> 
    Procedure SP_SetCurrentDate 
     (P_CurrentDate In Date) 
     Is 
     Begin 
       G_CurrentDate:=P_CurrentDate; 
     End SP_SetCurrentDate; 
  End PKG_System_Constant; 
  / 

測試:

   --測試讀取常數 
  Select PKG_System_Constant.FN_GetSystemTitle From Dual;    
  --測試設置全局變量 
  Declare  
  Begin 
    PKG_System_Constant.SP_SetCurrentDate(To_Date('2001.01.01','yyyy.mm.dd')); 
  End; 
  / 
  --測試讀取全局變量 
  Select PKG_System_Constant.FN_GetCurrentDate From Dual;

二、SYS_CONTEXT

        SYS_CONTEXT 函數是Oracle提供的一個獲取環境上下文信息的預定義函數。該函數用來返回一個指定namespace下的parameter值。該函數可以在SQL和PL/SQL語言中使用。
        SYS_CONTEXT 實際上就是一個Oracle存儲和傳遞參數的容器訪問函數。我們登入Oracle服務器,是帶有會話信息session_info和其他一些屬性信息。其中,有一些是Oracle預定義的,登錄系統的時候自動填入到指定的變量中。還有一些是我們自己定義到其中,用於傳遞值使用的。
        SYS_CONTEXT 語法格式:SYS_CONTEXT('namespace','parameter'{,LENGTH});其中,namespace是存儲信息的一個組group單位,namespace是按照類別進行分類的。一個namespace下可以有多個參數值,通過不同的parameter進行區分。namespace是預先定義好的SQL標識符,而parameter是可以任意大小寫非敏感的字符串,不超過30位長度。函數返回值為varchar2類型,長度默認為256位。如果需要限制這個默認值,可以數據length參數作為新的返回長度值。設置namespace指定parameter值,可以使用dbms_session.set_context方法進行。

1、創建、設置、讀取context

SQL> create context test using set_test_context;

Context created.

SQL> create or replace procedure set_test_context(value in varchar2) is
  2  begin
  3  dbms_session.set_context('test','key',value);
  4  end set_test_context;
  5  /

Procedure created.

SQL> exec set_test_context('This is a context set value!');

PL/SQL procedure successfully completed.

SQL> select sys_context('test','key') show_value from dual;

SHOW_VALUE
--------------------------------------------------------------------------------
This is a context set value!

2、Oracle預定義的context

SELECT SYS_CONTEXT ('USERENV', 'TERMINAL') terminal,
       SYS_CONTEXT ('USERENV', 'LANGUAGE') language,
       SYS_CONTEXT ('USERENV', 'SESSIONID') sessionid,
       SYS_CONTEXT ('USERENV', 'INSTANCE') instance,
       SYS_CONTEXT ('USERENV', 'ENTRYID') entryid,
       SYS_CONTEXT ('USERENV', 'ISDBA') isdba,
       SYS_CONTEXT ('USERENV', 'NLS_TERRITORY') nls_territory,
       SYS_CONTEXT ('USERENV', 'NLS_CURRENCY') nls_currency,
       SYS_CONTEXT ('USERENV', 'NLS_CALENDAR') nls_calendar,
       SYS_CONTEXT ('USERENV', 'NLS_DATE_FORMAT') nls_date_format,
       SYS_CONTEXT ('USERENV', 'NLS_DATE_LANGUAGE') nls_date_language,
       SYS_CONTEXT ('USERENV', 'NLS_SORT') nls_sort,
       SYS_CONTEXT ('USERENV', 'CURRENT_USER') current_user,
       SYS_CONTEXT ('USERENV', 'CURRENT_USERID') current_userid,
       SYS_CONTEXT ('USERENV', 'SESSION_USER') session_user,
       SYS_CONTEXT ('USERENV', 'SESSION_USERID') session_userid,
       SYS_CONTEXT ('USERENV', 'PROXY_USER') proxy_user,
       SYS_CONTEXT ('USERENV', 'PROXY_USERID') proxy_userid,
       SYS_CONTEXT ('USERENV', 'DB_DOMAIN') db_domain,
       SYS_CONTEXT ('USERENV', 'DB_NAME') db_name,
       SYS_CONTEXT ('USERENV', 'HOST') HOST,
       SYS_CONTEXT ('USERENV', 'OS_USER') os_user,
       SYS_CONTEXT ('USERENV', 'EXTERNAL_NAME') external_name,
       SYS_CONTEXT ('USERENV', 'IP_ADDRESS') ip_address,
       SYS_CONTEXT ('USERENV', 'NETWORK_PROTOCOL') network_protocol,
       SYS_CONTEXT ('USERENV', 'BG_JOB_ID') bg_job_id,
       SYS_CONTEXT ('USERENV', 'FG_JOB_ID') fg_job_id,
       SYS_CONTEXT ('USERENV', 'AUTHENTICATION_TYPE') authentication_type,
       SYS_CONTEXT ('USERENV', 'AUTHENTICATION_DATA') authentication_data
  FROM DUAL;

三、DBMS_SESSION包詳解
1)、set_identifier
說明:用於設置會話的客戶ID號。
語法:dbms_session.set_identifier(client_id varchar2);
其中client_id指定當前會話的應用標識符。

2)、set_context
說明:用於設置應用上下文屬性
語法:
dbms_session.set_context(namespace varchar2,attribute varchar2,value varchar2);
dbms_session.set_context(namespace varchar2,attribute varchar2,value varchar2,username varchar2,client_id varchar2);
其中namespace指定應用上下文的命名空間,attribute指定應用上下文的屬性,value指定屬性值,username指定應用上下文的用戶名屬性。

3)、clear_context
說明:用於清除應用上下文的屬性設置
語法:dbms_session.clear_context(namespace varchar2,client_identifier varchar2,attribute varchar2);
其中client_identifier只適用於全局上下文。

4)、clear_identifier
說明:用於刪除會話的set_client_id.
語法:dbms_session.clear_identifier();

5)、set_role
說明:用於激活或禁止會話角色,與sql語句set role作用完全相同。
語法:dbms_seesion.set_role(role_cmd varchar2);
例子:在sql*plus使用該過程激活或禁止角色如下
dbms_session.set_role(‘DBA’)
dbms_session.set_role(‘none’)

6)、set_sql_trace
說明:用於激活或禁止當前會話的SQL跟蹤,其作用與SQL語句alter session set sql_trace= 完全相同。
語法如下:dbms_session.set_sql_trace(sql_strace boolean);
其中sql_strace用於指定布爾值,true表示激活sql跟蹤,false表示禁止。
例子:在sql*plus使用該過程
exec dbms_session.set_sql_trace(true);
exec dbms_session.set_sql_trace(false);

7)、set_nls
說明:用於設置NLS特征,其作用與sql語句alter session set =完全相同。
語法:dbms_session.set_nls(param varchar2,value varchar2);
其中param指定nls參數,value指定nls參數
例子:在sql*plus使用該過程
exec dbms_seesion.set_nls(‘nls_date_format’,’’‘YYYY-MM-DD’’’);
select sysdate from dual;

8)、close_database_link
說明:用於關閉已經打開的數據庫鏈,其作用與SQL語句alter session close datebase link完全相同。
語法:dbms_session.close_database_link(dbline varchar2);
其中用於指定要關閉的數據庫連接名。

9)、reset_package
說明:用於復位當前會話的所有包,並且會釋放包狀態。
語法:dbms_session.reset_package;

10)、modify_package_state
說明:用於修改當前會話的PL/SQL程序單元的狀態
語法:dbms_session.modify_package_state(action_flags in pls_integer);
其中,action_flags指定pl/sql程序單元標記,當設置為1是,會釋放plsql程序單元所占用的內存;2則會重新初始化pl/sql包。

11)、unique_session_id
說明:用於返回當前會話的惟一ID標識符
例子:select dbms_session.unique_session_id from dual;

12)、is_role_enabled
說明:用於確定當前會話是否激活了特定角色.
語法:dbms_session.is_role_enabled(rolename varchar2) return boolean;
其中rolename指定角色名。返回true表示已激活,false表示未激活。
例子:set serveroutput on
begin
if dbms_session.is_role_enabled(‘DBA’) then
dbms_output.put_line(‘激活了’);
else dbms_output.put_line(‘沒激活’);
end if;
end;

13)、is_session_alive
說明:用於確定特定會話是否處於活動狀態.
語法:dbms_session.is_session_alive(uniqueid varchar2) return boolean;
其中uniqueid指定會話ID號,處於活動返回true,否則false。

14)、set_close_cached_open_cursors
說明:用於打開或關閉close_cached_open_cursors,其作用與alter session set close_cached_open_cursors完全相同。
語法:dbms_session.set_close_cached_open_cursors(close_cursors boolean);
其中close_cursors指定布爾值,設置為true打開,false關閉。

15)、free_unused_user_meory
說明:用於在執行了大內存操作(超過100K)之后回收未用內存
語法:dbms_session.pree_unused_user_memory;

16)、set_context
說明:設置應用上下文屬性的值.
語法:dbms_session.set_context(namespare varchar2,attribute varchar2,value varchar2,username varchar2,client_id varchar2);

17)、list_context
說明:用於返回當前會話原命名空間和上下文列表
語法:
type appctxrectyp is record(namespace varchar2(30),attribute varchar2(30),value varchar2(256));
type appctxtabtyp is table of appctxrectyp index by binary_integer;
dbms_session.list_context(list out appctxtabtyp,size out number);
其中list用於取得當前會話的列表集,size用於返回列表個數。

18)、swith_current_consumer_group
說明:用於改變當前會話的資源使用組
語法:dbms_session.switch_current_consumer_group(new_group in varchar2,old_group out varchar2,initial_group in boolean);
其中new_group指定新資源使用組;old_group指定原有資源實用組;initial_group指定布爾值,true表示出錯后使用原有資源使用組。

參考博客:

[1]Oracle數據庫程序包全局變量的應用

[2]SYS_CONTEXT 詳細用法

[3]DBMS_SESSION.SET_CONTEXT的使用及無效權限問題的解決

[4]Oracle基礎包六DBMS_SESSION


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM