在 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 命令的主要内容,如果未能解决你的问题,请参考以下文章

在 python 中防止 SQL 注入

使用 psycopg2 编写动态 SQL 字符串

如何在python的SQL查询中传递变量[重复]

我可以使用Java代码在sql语句(Oracle)的IN子句中传递字符串列表吗

在来自 python 的 SQL 查询中将整数作为 VARCHAR() 数据类型传递

Python、SQLAlchemy 在 connection.execute 中传递参数