在 Python 中使用 SQL 字符串传递 SET 命令
Posted
技术标签:
【中文标题】在 Python 中使用 SQL 字符串传递 SET 命令【英文标题】:passing SET commands with SQL string in Python 【发布时间】:2013-07-09 18:39:38 【问题描述】:我可以从 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', '')
最后,如果这不是获取值的最简单方法(这是我的目标 - 只返回一个值 - 这不是最终查询),请告诉我。欢迎任何建议!
【问题讨论】:
【参考方案1】:我无法测试其中的任何一个,但我可以看到其中的问题。第一个应该是:
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;
... 没有间隙,正如它所说,'OFFselect' 不是SET HEADING
的有效参数。这可能是最易于维护的方法,尤其是当您最终需要设置和执行几件事情时。
看来您至少会得到一组\r\n
,但我认为您对此无能为力,这只是从SQL*Plus 写信给stdout
;所以我认为你需要在 Python 端去掉它。
【讨论】:
以上是关于在 Python 中使用 SQL 字符串传递 SET 命令的主要内容,如果未能解决你的问题,请参考以下文章
我可以使用Java代码在sql语句(Oracle)的IN子句中传递字符串列表吗