ORACLE SQL:获取实例名称作为全局变量/常量

Posted

技术标签:

【中文标题】ORACLE SQL:获取实例名称作为全局变量/常量【英文标题】:ORACLE SQL : Get instance name as global variable/constant 【发布时间】: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;

【问题讨论】:

【参考方案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,尽管在您的示例中我并没有真正看到它的用途。

【讨论】:

以上是关于ORACLE SQL:获取实例名称作为全局变量/常量的主要内容,如果未能解决你的问题,请参考以下文章

全局数据库名称.数据库名称.SID是什么关系?

oracle 中字段作为变量的语句怎么写

如何在 oracle pl/sql 查询中动态获取字段名称?

011.T_SQL语法(sql实例)

oracle tnsname.ora中的SERVICE_NAME 代表实例的名称还是代表全局数据库的名称?

Oracle PL/SQL 动态 if 语句全局变量