Sqlplus参数和变量具有默认值

时间:2016-04-06 14:00:13

标签: oracle sqlplus

问题

我有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_tablespacedefault_indexspace的定义。 G。环境变量?

类似的东西:

define default_tablespace = isEnviromentVariableSet( 'OTHER_TABLESPACE') ? getEnvironmentVariable( OTHER_TABLESPACE) : 'MY_TABLESPACE';

这样,每当我通过某个实用程序从外部调用脚本时,我就可以使用不同的表空间,同时我可以保留默认的表空间。

非常感谢您的帮助!

1 个答案:

答案 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权利(我认为...... :-))