如何使用python在sqlplus中插入带有'&'的值
Posted
技术标签:
【中文标题】如何使用python在sqlplus中插入带有\'&\'的值【英文标题】:How to insert a value with '&' in sqlplus with python如何使用python在sqlplus中插入带有'&'的值 【发布时间】:2016-01-16 17:47:30 【问题描述】:import urllib
import requests
from bs4 import *
from subprocess import Popen,PIPE
import os
connectString = 'SYSTEM/mediadot123'
def runSqlQuery(sqlCommand, connectString):
session = Popen(['sqlplus', '-S', connectString], stdin=PIPE, stdout=PIPE, stderr=PIPE)
session.stdin.write(sqlCommand)
return session.communicate()
session = Popen(['C:\\app\khize_000\product\\11.2.0\dbhome_1\BIN\sqlplus.exe','-S','hr/hr'], stdin=PIPE, stdout=PIPE, stderr=PIPE)
stdout, stderr = session.communicate()
sqlCommand = "set define off;"
queryResult, errorMessage = runSqlQuery(sqlCommand, connectString)
print queryResult
titledb = "retrieved from somewhere else with & in it"
sqlCommand = "insert into food(title) values ('" + str(titledb.encode('utf-8')) + "');"
queryResult, errorMessage = runSqlQuery(sqlCommand, connectString)
print queryResult
我在 oracle 网站上看到了“设置定义关闭”查询,但它对我的代码不起作用。它在命令行中工作,但不在此处。它给了我以下错误:
培根土豆鸡蛋砂锅早餐
输入鸡蛋的值:
SP2-0546:检测到用户请求的中断或 EOF。
【问题讨论】:
import cx_Oracle
然后使用准备好的语句。
【参考方案1】:
set define off
命令不会在 SQLPlus 会话之间持续存在。每次调用runSQLQuery
时,您都会打开一个新的SQLPlus 实例。您需要在与实际插入命令相同的会话中执行 set define off
才能达到预期效果。
如果您确信在此上下文中永远不需要替换功能,您可以在发送作为参数传递的语句之前,在runSQLQuery
函数中将其作为命令发送到 SQLPlus。
您可以重新设计整个逻辑以保持单个 SQLPlus 会话处于打开状态并向其写入多个命令。
或者,您可以找到一个合适的库,用于从 Python 直接连接到 Oracle,而不是执行外部 SQLPlus 进程。
【讨论】:
sqlCommand = "set define off;插入 food(title) 值 ('" + str(titledb.encode('utf-8')) + "');" queryResult, errorMessage = runSqlQuery(sqlCommand, connectString) print queryResult 我也试过这种方式,但仍然报同样的错误。 当然,因为您仍在发送一行,并且 SQLplus 在尝试实际执行之前首先解析该行以查找替换变量,这就是导致问题的原因。您需要编写模拟交互方式的代码 - 输入“set define off”,按 Enter,然后输入插入命令。 我试过这个:sqlcommand = "set define off;\n insert into......"
它奏效了.. 非常感谢以上是关于如何使用python在sqlplus中插入带有'&'的值的主要内容,如果未能解决你的问题,请参考以下文章