2016-03-01 19 views
0

我有一个脚本,我想维护作为一个单一的文件,但我希望呼应命令输入到sqlplus而不使用PROMPT <sql>@script.sql可以这样做吗?回声sqlplus命令不使用提示或脚本

当前脚本:

$ cat test.sh 
#!/bin/bash 
LOG=/home/oracle/output.log 
sqlplus hr/hr <<EOF > $LOG 
set echo on 
select 1 from dual; 
QUIT 
EOF` 

电流输出:

$ cat output.log 
SQL*Plus: Release 11.2.0.4.0 Production on Tue Mar 1 15:01:12 2016 
Copyright (c) 1982, 2013, Oracle. All rights reserved. 
Connected to: 
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production 
With the Partitioning, Oracle Label Security, OLAP, Data Mining, 
Oracle Database Vault and Real Application Testing options 

SQL> SQL> 
     1 
---------- 
     1 

我想要什么:

$ cat output.log 

SQL*Plus: Release 11.2.0.4.0 Production on Tue Mar 1 15:02:02 2016 

Copyright (c) 1982, 2013, Oracle. All rights reserved. 


Connected to: 
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production 
With the Partitioning, Oracle Label Security, OLAP, Data Mining, 
Oracle Database Vault and Real Application Testing options 

SQL> SQL> SQL> select 1 from dual; 

     1 
---------- 
     1 
+0

尝试:在 – MaxU

+0

设置项试过了,它并不能工作。 –

+0

你特别想要横幅 - 所以假脱机不是一个选项?并且不允许创建临时脚本? –

回答

1

尝试spool而不是重定向您的标准输出:

#!/bin/bash 
LOG=/home/oracle/output.log 
sqlplus hr/hr <<EOF 
set echo on term on 
spool $LOG 
select 1 from dual; 
QUIT 
EOF 
+0

我选择这个作为正确的答案,因为它最适合我的需要,hower @ Mr.llama有一个很好的答案,它也适合其他人的需要。 –

3

当SQL * Plus正在从您的TTY读取命令时,输入的回显实际上是由您的TTY而不是SQL * Plus处理的。如果SQL * Plus处理回显,任何时候您手动键入一个命令,您都会看到该命令两次(一次输入时,一次回显)。

此外,TERMOUT选项仅适用于运行脚本文件,而不是从STDIN读取。

的简单的解决方法是告诉SQL * Plus的那/dev/stdin是一个脚本:

sqlplus scott/tiger @/dev/stdin <<EOF 
SET TERMOUT ON ECHO ON 
SELECT SYSDATE FROM dual; 
EOF