zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    动手动脑,11.9
    《构建之法》读书笔记
    字符加密
    字符动手动脑
    河北重大技术需求开发第七版开发第五天
    河北重大技术需求开发第七版开发第四天
    河北重大技术需求开发第七版开发第三天
    河北重大技术需求开发第七版开发第二天
    hbase基本操作体会
    河北重大技术需求开发第七版开发第一天
  • 原文地址:https://www.cnblogs.com/shujk/p/13983202.html
Copyright © 2011-2022 走看看