2016-11-14 92 views
0

我试图将shell变量传递给SQL * Plus,以用作脚本中的create tablespace语句中的替换变量。将shell变量传递给SQL * Plus创建语句

sqlplus -s -l shiyas/******** @/path/schema_creation_script.sql "$DEST_SCH" <<EOF 
EOF 

上述.sql文件内的表空间创建脚本

CREATE TABLESPACE &1 DATAFILE '/data1/data/mcpod/&1_01.dbf' 
SIZE 104864 k AUTOEXTEND ON NEXT 10240 K FLASHBACK off; 

的创建表空间失败。我下面的语句尝试创建表空间脚本里面:

CREATE TABLESPACE &1 DATAFILE '/data1/data/mcpod/"&1"_01.dbf' 
SIZE 104864 k AUTOEXTEND ON NEXT 10240 K FLASHBACK off; 

的tablspace和数据文件被创建。但数据文件是用双引号创建的。

/data1/data/mcpod/"C_40050"_01.dbf 

如何传递shell变量并创建表空间而不必在datafule名称中使用双引号?

回答

0

你需要一个周期终止替代变量:

CREATE TABLESPACE &1 DATAFILE '/data1/data/mcpod/&1._01.dbf' SIZE 104864 k AUTOEXTEND ON NEXT 10240 K FLASHBACK off; 
               ^

The documentation says

如果您想置换变量后立即追加字符,请使用周期变量从分离人物。例如:

SELECT SALARY FROM EMP_DETAILS_VIEW WHERE EMPLOYEE_ID='&X.5'; 
Enter value for X: 20 

SELECT SALARY FROM EMP_DETAILS_VIEW WHERE EMPLOYEE_ID='205'; 

你正在做类似的解释。在您的原始代码&1_01.dbf被解释为一个单一的替代变量,称为1_01;期限终止了;然后追加dbf

您没有为名为1_01的变量提供值,因此它会提示您。您的shell脚本不会执行此操作,但是如果您再次以相同的值C_40050对该提示作出响应,则create的最终数据文件参数将为'/data1/data/mcpod/C_40050dbf',而在dbf之前没有时间段。

由于增加了终止期限,使其现有的参数将仍然作为一个替代的位置值,因此数据文件参数将是'/data1/data/mcpod/C_40050_01.dbf' - 只有&1_01.部分被替换。

+0

非常感谢。使用'。'终止。工作得很好。问题已解决。非常感谢支持。 – user3441224