【问题标题】:ORACLE SQL : Get instance name as global variable/constantORACLE SQL:获取实例名称作为全局变量/常量
【发布时间】:2021-12-02 16:06:21
【问题描述】:

如果条件正确,我想读取实例名称并将某个常量设置为 true。

比如我已经有了这个

--DYNAMICALLY CREATE A PACKAGE TO HOLD CONSTANTS.
BEGIN
    EXECUTE IMMEDIATE
    '
    CREATE OR REPLACE PACKAGE XXX_COMPILATION_CONSTANTS IS 
    C_MAKE_PUBLIC_XXX_SCHEMA CONSTANT BOOLEAN := '||CASE WHEN USER = 'TEST' THEN 'TRUE' ELSE 'FALSE' END||';
    END;
    ';
END;

我如何读取上面的 USER 之类的实例名称?

--DYNAMICALLY CREATE A PACKAGE TO HOLD CONSTANTS.
BEGIN
    EXECUTE IMMEDIATE
    '
    CREATE OR REPLACE PACKAGE XXX_COMPILATION_CONSTANTS IS 
    C_MAKE_PUBLIC_XXX_SCHEMA CONSTANT BOOLEAN := '||CASE WHEN **INSTANCE**= 'MY_TEST_DB' THEN 'TRUE' ELSE 'FALSE' END||';
    END;
    ';
END;

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

    我的猜测是您可能不想创建自己的包。 USERENV context 可能已经拥有您想要的所有信息。

    sys_context( 'USERENV', 'CURRENT_USER' )
    

    对于当前用户和

    sys_context( 'USERENV', 'INSTANCE_NAME` )
    

    为实例的名称。在我链接到的文档中,您可以看到该上下文中的许多其他属性已经填充了有用的信息。

    【讨论】:

    • 谢谢,但我需要在包里
    • @Jeremy - 如果你真的想要它在包中,你可以使用sys_context( 'USERENV', 'INSTANCE_NAME' ) 在你的case 语句中获取实例名称。
    • 谢谢。我不知道我尝试了什么,但我在网上也发现了这个,怎么也编译不了。我需要它在包中,因为我将它用于条件编译。你帮了我很多谢谢!
    【解决方案2】:

    如果您使用sys_context('userenv','instance_name'),则您的示例有效:

    begin
        execute immediate
        'create or replace package xxx_compilation_constants as 
        c_make_public_xxx_schema constant boolean := '||
            case
                when sys_context('userenv','instance_name') = 'MY_TEST_DB' then 'TRUE'
                else 'FALSE'
            end||';
        end;
    ';
    end;
    

    创建一个包为:

    create or replace package xxx_compilation_constants as
        c_make_public_xxx_schema constant boolean := FALSE;
        end;
    

    但是,将包静态定义为:

    create or replace package xxx_compilation_constants
    as
        c_make_public_xxx_schema constant boolean :=
            sys_context('userenv','instance_name') = 'MY_TEST_DB';
    end;
    

    您也可以查看 conditional compilation,尽管在您的示例中我并没有真正看到它的用途。

    【讨论】:

      猜你喜欢
      • 2021-12-18
      • 2014-06-15
      • 1970-01-01
      • 2012-03-18
      • 2013-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-17
      相关资源
      最近更新 更多