#oracle #cmd #sqlplus
#Oracle #cmd #sqlplus
Вопрос:
я пишу пакетный файл для мастера создания моего табличного пространства. через несколько дней моим результатом для этого мастера будет приведенный ниже код.
я создаю переменную с именем ‘Path’. затем я выбираю местоположение своего файла данных и сохраняю его в ‘Path’.
поскольку я не мог использовать ‘Path’ в нашем операторе create, я определил переменную в sqlplus с именем ‘Loc’ и передал значение ‘path’ в ‘Loc’.
вот мой сценарий:
sqlplus >var path varchar2(100)
sqlplus >exec select substr(name, 1, instr(name, 'USER') - 1) || 'test.ora' into :path from v$datafile where name like '%USER%';
sqlplus >def loc=:path
sqlplus >CREATE TABLESPACE test
1 > LOGGING
2 > BLOCKSIZE 16384 DATAFILE 'amp;loc' SIZE 100M REUSE
3 > AUTOEXTEND
4 > ON NEXT 50M MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL
5 > SEGMENT SPACE MANAGEMENT AUTO;
результат моего скрипта был:
SQL> CREATE TABLESPACE test
2 LOGGING
3 BLOCKSIZE 16384 DATAFILE 'amp;loc' SIZE 100M REUSE
4 AUTOEXTEND
5 ON NEXT 50M MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL
6 SEGMENT SPACE MANAGEMENT AUTO;
old 3: BLOCKSIZE 16384 DATAFILE 'amp;loc' SIZE 100M REUSE
new 3: BLOCKSIZE 16384 DATAFILE ':path' SIZE 100M REUSE
CREATE TABLESPACE test
*
ERROR at line 1:
ORA-01119: error in creating database file ':path'
ORA-27040: file create error, unable to create file
OSD-04002: unable to open file
O/S-Error: (OS 123) The filename, directory name, or volume label syntax is
incorrect.
Ответ №1:
Привязка переменных не поможет в DDL, статическом или ином. Придерживайтесь переменных подстановки:
column loc new_value loc
select substr(name, 1, instr(name, 'USER') - 1) || 'test.ora' as loc
from v$datafile where name like '%USER%';
create tablespace test
logging
blocksize 16384
datafile 'amp;loc' size 100m reuse
autoextend on next 50m maxsize unlimited
extent management local
segment space management auto;