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网站上看到'set define off'查询,但它对我的代码不起作用。它在命令行中工作但不在此处。它给了我以下错误:
培根,马铃薯&鸡蛋早餐砂锅
输入蛋的值:
SP2-0546:用户请求检测到中断或EOF。
答案 0 :(得分:0)
set define off
命令在SQLPlus会话之间不会保留。每次调用runSQLQuery
时,都会打开一个新的SQLPlus实例。您需要在与实际插入命令相同的会话中执行set define off
才能获得所需的效果。
如果您确信在此上下文中不需要替换功能,则可以在发送作为参数传递的语句之前将其作为命令发送到runSQLQuery
函数中的SQLPlus。
您可以重新设计整个逻辑,以保持单个SQLPlus会话打开并向其写入多个命令。
或者,您可以找到一个适当的库,用于从Python直接连接到Oracle,而不是执行外部SQLPlus过程。