问题
我有sql脚本,可能会为不同的数据库用户使用不同的表空间。
为了保持表创建的灵活性,我想只保留一个脚本并将其应用于各种用户。为此我有这样的事情:
表空间:
CREATE TABLESPACE MY_TABLESPACE DATAFILE 'MY_TABLESPACE.dat' SIZE 40M ONLINE;
CREATE TABLESPACE MY_INDEXSPACE DATAFILE 'MY_INDEXSPACE.dat' SIZE 40M ONLINE;
表创建脚本:
define default_tablespace = 'MY_TABLESPACE';
define default_indexspace = 'MY_INDEXSPACE';
drop table test_table;
create table test_table ( id number ) tablespace &default_tablespace;
create index my_index on test_table( id) tablespace &default_indexspace;
我。即我无法为用户设置默认表空间,因为索引使用不同的表空间。
问题
是否可以根据e覆盖default_tablespace
和default_indexspace
的定义。 G。环境变量?
类似的东西:
define default_tablespace = isEnviromentVariableSet( 'OTHER_TABLESPACE') ? getEnvironmentVariable( OTHER_TABLESPACE) : 'MY_TABLESPACE';
这样,每当我通过某个实用程序从外部调用脚本时,我就可以使用不同的表空间,同时我可以保留默认的表空间。
非常感谢您的帮助!
答案 0 :(得分:0)
在DDL操作(创建,删除等)中,你不能使用变量。
简单的方法是使用像这样的pl / sql匿名块。
declare
my_tabable_space varchar2(100) default 'my_some_tablespace';
other_tablespace varchar2(100);
begin
DBMS_SYSTEM.get_env('OTHER_TABLESPACE',other_tablespace);
if other_tablespace is not null then
my_tabable_space := other_tablespace ;
end if;
execute immediate 'create table test_table ( id number ) tablespace' || my_tabable_space;
end;
/
对于选择ENV变量你可以使用DBMS_SYSTEM.get_env(' VARIABLE',my_variable的名称),但是这个包需要DBA权利(我认为...... :-))