【问题标题】:Oracle SQL statement dynamic schema variableOracle SQL 语句动态模式变量
【发布时间】:2015-12-29 23:36:56
【问题描述】:

我有数百行代码来创建表,但架构名称在所有 DDL 语句中都像 SCHEMA_NAME1.TABLE_NAME 一样硬编码。我怎样才能将它作为一个变量并在所有地方使用,以便我们可以在一个地方轻松更改 SCHEMA_NAME 要求的多个位置。请给出您的想法。

create table SCHEMA_NAME1.TABLE_NAME1(....);
create table SCHEMA_NAME1.TABLE_NAME2(....);
create table SCHEMA_NAME1.TABLE_NAME3(....);

我想要这样的东西

var SCHEMA_NAME_VALUE ;
create table SCHEMA_NAME_VALUE.TABLE_NAME1(....);
create table SCHEMA_NAME_VALUE.TABLE_NAME2(....);
create table SCHEMA_NAME_VALUE.TABLE_NAME3(....);

【问题讨论】:

  • 您必须编写一个 PL/SQL 程序才能达到此目的并使用动态 sql。在为不同的环境创建 DDL 脚本之前,您不能只使用文本编辑器并替换实例吗?
  • 如果您可以使用 SQL*Plus,则使用替换变量 - create table &SCHEMA_NAME.TABLE_NAME1(....); 并使用 schema 参数执行脚本。如果代码只创建表、视图或授权,您可以将所有内容转换为单个 CREATE SCHEMA AUTHORIZATION 命令。
  • 对模式名称的每个实例仅使用一个与符号& 将要求用户为替换变量的每个实例输入一次模式名称。在第一次出现时使用双 & 符号 &&,或者在脚本开头使用 ACCEPT 命令将只允许输入一次值。 ACCEPT 命令是更可取的方法,因为它确保您可以在每次运行脚本时设置值。您还应该在末尾添加UNDEFINE
  • 使用替换 (&) 变量时,不要忘记将尾随句点加倍,因为句点用作变量名称的可选终止字符。当变量名称后面没有空格时,需要使用句点终止字符,如上所述,因此您需要将其加倍,以免丢失分隔模式名称和对象名称的句点。

标签: sql oracle ddl


【解决方案1】:

使用 SQL*Plus 或 SQLcl 运行对象创建脚本时,使用替换 (&) 变量代替硬编码的模式名称,并使用前导 ACCEPT 命令和尾随 UNDEFINE 命令。当变量没有尾随空格时,以句点 (.) 结束变量名。

ACCEPT SCHEMA_NAME_VALUE
create table &SCHEMA_NAME_VALUE..TABLE_NAME1(....);
create table &SCHEMA_NAME_VALUE..TABLE_NAME2(....);
create table &SCHEMA_NAME_VALUE..TABLE_NAME3(....);
UNDEFINE SCHEMA_NAME_VALUE

【讨论】:

  • 但通常没有任何工具它没有用。
  • @sunleo 如果你没有任何工具,你打算如何运行它?
  • 这可以像 java 的批处理作业一样完成,所以我认为在这种情况下我们不需要一些工具。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-07
  • 1970-01-01
  • 1970-01-01
  • 2016-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多