Oracle SQL语句动态模式变量

3

我有一些百行代码用于创建表,但在所有的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脚本之前,使用文本编辑器替换实例吗? - Incognito
如果您可以使用SQL*Plus,则可以使用替换变量 - create table &SCHEMA_NAME.TABLE_NAME1(....); 并使用模式参数执行脚本。如果代码仅创建表、视图或授权,则可以将所有内容转换为单个 CREATE SCHEMA AUTHORIZATION 命令。 - Husqvik
每个模式名称实例只使用一个和号&需要用户为每个替换变量的实例输入一次模式名称。对于第一次出现,使用双和号&&或在脚本开头使用ACCEPT命令可以只输入一次值。ACCEPT命令是更可取的方法,因为它确保您每次运行脚本时都可以设置该值。您还应在末尾包括UNDEFINE - Sentinel
使用替换(&)变量时,不要忘记加倍尾随句点,因为句点用作变量名称的可选终止字符。当变量名称后面没有空格时,需要使用句点终止字符,正如上面的情况一样,所以您需要加倍使用它,以便不丢失模式名称与对象名称之间的句点分隔符。 - Sentinel
1个回答

3

当使用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
2
@sunleo 如果你没有任何工具,你打算如何首先运行它呢? - Sentinel
这可以像从Java批处理作业一样完成,因此我认为在这种情况下我们不需要使用任何工具。 - sunleo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接