将shell变量传递给SQL * Plus创建语句

时间:2016-11-14 16:44:12

标签: oracle shell sqlplus

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

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脚本中尝试使用下面的语句:

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

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

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

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

1 个答案:

答案 0 :(得分:0)

您需要使用句点终止替换变量:

######################################################################
# Automatically generated by qmake (3.0) Tue Nov 15 00:30:22 2016
######################################################################

TEMPLATE = app
TARGET = HelloQtWorld
INCLUDEPATH += .

# Input
HEADERS += stdafx.h Test.h
SOURCES += anotherClass.cpp \
           main.cpp \
           stdafx.cpp \
           GeneratedFiles/qrc_helloqtworld.cpp
RESOURCES += helloqtworld.qrc

The documentation says

  

如果您希望在替换变量之后立即追加字符,请使用句点将变量与字符分开。例如:

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

被解释为

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的变量提供值,因此会提示该值。您的shell脚本不会执行此操作,但如果您使用相同的值1_01再次响应该提示,则C_40050的最终数据文件参数将为create,之前没有句点'/data1/data/mcpod/C_40050dbf'

通过添加终止周期使其dbf,您现有的参数仍将用作位置替换值,因此datafile参数将为&1._01.dbf - 仅'/data1/data/mcpod/C_40050_01.dbf'部分被替换。