【问题标题】:Dynamic Schema name in SQL based on database-name OracleSQL 中基于数据库名称 Oracle 的动态模式名​​称
【发布时间】:2014-02-03 05:40:59
【问题描述】:

我有一个 DML 语句“简单更新语句”,需要在不同的 Oracle 环境(DEV、SIT、QA、PROD)中执行。截至目前,我在 Alter Session Command 中硬编码模式名称并运行 DML 语句。所以我需要在整个环境中维护 4 个不同的脚本。 有没有办法我可以从数据库名称中获取脚本正在运行的数据库名称,我可以使用 If Else Condition 在架构之间进行选择并将其分配给 ALTER SESSION 命令?

【问题讨论】:

    标签: oracle database-schema code-reuse


    【解决方案1】:

    获取当前架构名称:

    select user from dual
    

    这就是你所追求的吗?

    【讨论】:

      【解决方案2】:

      您可以从v$database view 中查询名称。如何将其转换为 alter session 命令取决于您的客户端以及您的连接方式。

      例如,在 SQL*Plus 中你可以这样做:

      column x_schema new_value y_schema noprint
      set termout off
      
      select case name
        when 'DEVDB' then 'DEVSCHEMA'
        when 'PRODDB' then 'PRODSCHEMA'
        ...
        end as x_schema
      from v$database;
      
      alter session set current_schema = &y_schema;
      set termout on
      

      第一个查询使用数据库名称来确定架构名称; column 命令使该列别名 x_schema 稍后可用作替换变量 &y_schema。然后在alter 中使用。 set termout 是可选的,但如果它作为脚本的一部分运行,它将隐藏查询(尽管我猜 noprint 有点毫无意义)。

      如果您愿意,您可以将case 建立在global_name.global_name 上,或者甚至是sys_context('USERENV', 'SERVICE_NAME')

      当然,您也可以在运行 DML 脚本时将架构名称作为位置参数传入。我认为,对于不同数据库中的同一个应用程序,架构名称不同是不寻常的,但如果您遇到这种情况,这应该可以工作。

      【讨论】:

      • 当我尝试执行该语句时出现以下错误。 'SQL*Plus 命令被忽略:列 v_schema 新值 y_schema noprint X_SCHEMA DEV_SCHEMA ORA-02421:模式授权标识符缺失或无效'
      • @balaji - 抱歉,我显然没有测试过,并且设法在那个简短的 sn-p 中出现了三个错误 - 在 column 命令中出现了两个错误,不知何故。很差的节目。我已经更新了经过测试的 (!) 代码。
      • 非常感谢。现在可以了。感谢您提供信息并感谢您向我介绍“COLUMN”功能..
      猜你喜欢
      • 2018-11-16
      • 2019-10-21
      • 2013-11-18
      • 1970-01-01
      • 2020-05-18
      • 2021-03-26
      • 2015-01-08
      • 2021-09-05
      • 1970-01-01
      相关资源
      最近更新 更多