SQL中基于数据库名称Oracle的动态模式名​​称

时间:2014-01-14 22:56:37

标签: oracle database-schema code-reuse

我有一个DML语句“简单更新语句”,我需要在不同的Oracle环境(DEV,SIT,QA,PROD)中执行。截至现在我在Alter Session Command和运行DML语句中编写模式名称。所以我需要在整个环境中维护4个不同的脚本。 有没有办法可以从数据库名称获取脚本运行的数据库名称我可以使用如果在条件之间选择其他条件并将其分配给ALTER SESSION COMMAND?

2 个答案:

答案 0 :(得分:3)

您可以从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脚本时将架构名称作为位置参数传递。我认为,对于不同数据库中的相同应用程序,模式名称是不同的,这是不寻常的,但如果情况确实如此,这应该有用。

答案 1 :(得分:0)

获取当前架构名称:

select user from dual

这就是你要追求的吗?