在Python中使用SQL字符串传递SET命令

时间:2013-07-09 18:39:38

标签: python sqlplus

我可以从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 =“从双重选择sysdate;”   session.communicate(SqlCommand的)   ('\ r \ nSYSDATE \ r \ n --------- \ r \ n-J09-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', '')

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

1 个答案:

答案 0 :(得分: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;

......没有间隙,'OFF选'不是SET HEADING的有效参数,正如它所说的那样。这可能是最易维护的方法,特别是如果你最终要设置和执行几件事。

看来你将至少获得一组\r\n,但我认为你不能做任何事情,只是从SQL * Plus写到stdout;因此,我认为你需要在Python方面删除它。