我有一种情况,我需要在一个连接下连续运行许多脚本。一些脚本在运行时需要人工输入。我组织这个的方式是我有一个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;
因此,总结一下 - 在将替换参数添加到嵌套脚本
中我做错了什么答案 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