如何使用 python 在 sqlplus 中插入带有“&”的值

How to insert a value with '&' in sqlplus with python

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' 查询,但它对我的代码不起作用。它在命令行中工作,但不在此处。它给了我以下错误:

Bacon, Potato & Egg Breakfast Casserole

Enter value for egg:

SP2-0546: User requested Interrupt or EOF detected.

set define off 命令不会在 SQLPlus 会话之间持续存在。每次调用 runSQLQuery 时,您都会打开一个新的 SQLPlus 实例。您需要在与实际插入命令相同的会话中执行 set define off 才能达到预期效果。

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

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

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