【问题标题】:Passing shell variable to SQL*Plus create statment将 shell 变量传递给 SQLPlus 创建语句
【发布时间】:2016-11-15 01:06:22
【问题描述】:

我正在尝试将一个 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 &1 DATAFILE '/data1/data/mcpod/"&1"_01.dbf'
SIZE 104864 k AUTOEXTEND ON NEXT 10240 K FLASHBACK off;

表空间和数据文件已创建。但是数据文件是用双引号创建的。

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

如何传递 shell 变量并创建表空间,而不必在数据文件名中使用双引号?

【问题讨论】:

    标签: oracle shell sqlplus


    【解决方案1】:

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

    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';
    

    你正在做类似的事情。在您的原始代码中,&amp;1_01.dbf 被解释为一个名为 1_01 的替换变量;该期间终止;然后附加dbf

    您没有为名为@9​​87654328@ 的变量提供值,因此它会提示您输入该值。您的 shell 脚本不会执行此操作,但如果您再次使用相同的值 C_40050 响应该提示,则 create 的最终数据文件参数将是 '/data1/data/mcpod/C_40050dbf',在 dbf 之前没有句点。

    添加终止句点以使其成为&amp;1._01.dbf,您现有的参数仍将用作位置替换值,因此数据文件参数将为'/data1/data/mcpod/C_40050_01.dbf' - 仅替换&amp;1_01. 部分。

    【讨论】:

    • 非常感谢。使用 '.' 终止工作正常。问题已解决。非常感谢您的支持。
    猜你喜欢
    • 2013-05-04
    • 2013-07-08
    • 1970-01-01
    • 2013-10-17
    • 1970-01-01
    • 2023-03-25
    • 2011-12-10
    • 2020-12-06
    • 1970-01-01
    相关资源
    最近更新 更多