将替换变量传递给嵌套脚本

时间:2017-05-31 15:25:39

标签: oracle shell sqlplus

我有一种情况,我需要在一个连接下连续运行许多脚本。一些脚本在运行时需要人工输入。我组织这个的方式是我有一个Windows批处理文件,它提示用户输入所需的参数。然后,该批处理文件将获取的参数值传递给SQL脚本。

问题是变量值没有到达嵌套脚本。如果我绕过中间脚本,它工作正常。似乎问题在于将值代理到第二个。

请参阅下面的compelte测试用例。在我的例子中,我只调用一个嵌套脚本(Script1.sql)。但是,在现实世界中,我可能会有多个这样的脚本。

创建表格

CREATE TABLE TEST_TABLE
(
  TEST_ID     NUMBER,
  CREATED_BY  VARCHAR2(100 CHAR)
)
LOGGING 
NOCOMPRESS 
NOCACHE
RESULT_CACHE (MODE DEFAULT)
NOPARALLEL
MONITORING;

SET DEFINE OFF;
Insert into TEST_TABLE
   (TEST_ID, CREATED_BY)
 Values
   (1, 'FirstUser');
Insert into TEST_TABLE
   (TEST_ID, CREATED_BY)
 Values
   (2, 'SecondUser');
Insert into TEST_TABLE
   (TEST_ID, CREATED_BY)
 Values
   (3, 'ThirdUser');
COMMIT;

Windows批处理文件(TEST_BAT.bat)

:begin 
@ECHO oFF
cls
set /p SID=DB_SID:
set /p USER=USER:
set /p USERPASS=USER PASS:
set /p NEW_USER_NAME=NEW USER NAME:
ECHO %SID%
ECHO %USER%
sqlplus %USER%/%USERPASS%@%SID% @TEST_SCRIPTS.sql %NEW_USER_NAME%
ECHO.

掌握SQL脚本(TEST_SCRIPTS.sql)

SET PAGESIZE 100
SET DEFINE OFF
SET SCAN OFF
SET FEEDBACK ON
SPOOL INSTALL_LOG.txt
@'Script1.sql' &1
SET FEEDBACK OFF

嵌套脚本1(Script1.sql)

SET PAGESIZE 100
SET DEFINE OFF
SET SCAN OFF
SET FEEDBACK ON
UPDATE TEST_TABLE SET CREATED_BY='&1';
COMMIT;

因此,总结一下 - 在将替换参数添加到嵌套脚本

中我做错了什么

1 个答案:

答案 0 :(得分:2)

我在帖子中并不完全确定问题是脚本是否提示输入&1,或者是否正在编写值& 1 CREATED_BY而不是提供的命令行arg。

如果是后者,这个问题可能与在访问arg之前使用SET DEFINE OFF而不是脚本本身的结构有关。 (顺便说一下SET SCAN已经过时了。)

使用您的示例表和脚本不变,我得到以下(使用sql-plus 12.2):

sqlplus myuser/mypass@mydatabase @TEST_SCRIPTS.sql VOLTRON


SQL*Plus: Release 12.2.0.1.0 Production on Wed May 31 12:58:46 2017

3 rows updated.
Commit complete.

SELECT * FROM TEST_TABLE;

TEST_ID  CREATED_BY  
1        &1          
2        &1          
3        &1          

但是,如果删除SET DEFINE OFF(和SET SCAN OFF),则会发生替换,如下所示:

sqlplus myuser/mypass@mydatabase @TEST_SCRIPTS.sql VOLTRON

SQL*Plus: Release 12.2.0.1.0 Production on Wed May 31 13:11:53 2017
old   1: UPDATE TEST_TABLE SET CREATED_BY='&1'
new   1: UPDATE TEST_TABLE SET CREATED_BY='VOLTRON'

3 rows updated.
Commit complete.

现在替换已经传递到内部脚本。

SELECT * FROM TEST_TABLE;

TEST_ID  CREATED_BY  
1        VOLTRON     
2        VOLTRON     
3        VOLTRON