如何使用'&'插入值在sqlplus中使用python

时间:2016-01-16 17:47:30

标签: python oracle insert sqlplus

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。

1 个答案:

答案 0 :(得分:0)

set define off命令在SQLPlus会话之间不会保留。每次调用runSQLQuery时,都会打开一个新的SQLPlus实例。您需要在与实际插入命令相同的会话中执行set define off才能获得所需的效果。

如果您确信在此上下文中不需要替换功能,则可以在发送作为参数传递的语句之前将其作为命令发送到runSQLQuery函数中的SQLPlus。

您可以重新设计整个逻辑,以保持单个SQLPlus会话打开并向其写入多个命令。

或者,您可以找到一个适当的库,用于从Python直接连接到Oracle,而不是执行外部SQLPlus过程。