0

我可以从 Python 中很好地传递一个 sql 命令,但似乎无法将它与 SET 结合起来——我不想要标题,所以 SET HEADING OFF 是我正在尝试的。

这是显示我要去哪里的4次尝试:

1 - 获取日期,但也有错误消息:

session = Popen(['sqlplus','-S','user/pass@ORCL'], stdin=PIPE, stdout=PIPE, stderr=PIPE)
sqlCommand = "SET HEADING OFF \n / \n select sysdate from dual;"
session.communicate(sqlCommand)
('SP2-0103: Nothing in SQL buffer to run.\r\n\r\n09-JUL-13\r\n\r\n', '')

2 - 没有 SET 的命令:

session = Popen(['sqlplus','-S','user/pass@ORCL'], stdin=PIPE, stdout=PIPE, stderr=PIPE) sqlCommand = "select sysdate from dual;" session.communicate(sqlCommand) ('\r\nSYSDATE\r\n---------\r\n09-JUL-13\r\n\r\n', '')

3 - 尝试了单线:

session = Popen(['sqlplus','-S','user/pass@ORCL'], stdin=PIPE, stdout=PIPE, stderr=PIPE)
sqlCommand = "set heading off \select sysdate from dual;"
session.communicate(sqlCommand)
('SP2-0158: unknown SET option "\\select"\r\n', '')

4 - 试图分成两个电话:

session = Popen(['sqlplus','-S','user/pass@ORCL'], stdin=PIPE, stdout=PIPE, stderr=PIPE)
sqlCommand = "select sysdate from dual;"
session.stdin.write('SET HEADING OFF')
session.communicate(sqlCommand)
('SP2-0265: heading must be set ON or OFF\r\n', '')

最后,如果这不是获取值的最简单方法(这是我的目标 - 只返回一个值 - 这不是最终查询),请告诉我。欢迎任何建议!

4

1 回答 1

0

我无法测试其中任何一个,但我可以看到其中的问题。第一个应该是:

sqlCommand = "SET HEADING OFF \n select sysdate from dual;"

错误“SQL 缓冲区中没有要运行的内容”来自/它自己,它尝试运行上一个命令,但还没有。在这种情况下,这SET不是一个可运行的命令;它是 SQL*Plus 客户端命令,而不是需要处理的语句。

第三个应该是:

sqlCommand = "set heading off \n select sysdate from dual;"

...这与上面相同,但这次您错过了n\n分隔符。

我对第四个不太确定,但看起来应该是:

sqlCommand = "select sysdate from dual;"
session.stdin.write('SET HEADING OFF\n')

...再次缺少换行符。从这次的错误来看,它似乎试图背靠背运行这两个部分,即:

SET HEADING OFFselect sysdate from dual;

SET HEADING...没有间隙,正如它所说,'OFFselect' 不是 的有效参数。这可能是最易于维护的方法,尤其是当您最终需要设置和执行几件事情时。

看来您至少会得到一组\r\n回报,但我认为您对此无能为力,这只是从 SQL*Plus 写入stdout; 所以我认为你需要在 Python 端去掉它。

于 2013-07-16T17:16:05.450 回答