【问题标题】: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 然后使用准备好的语句。

标签: python oracle insert sqlplus


【解决方案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......" 它奏效了.. 非常感谢
猜你喜欢
  • 1970-01-01
  • 2020-09-03
  • 1970-01-01
  • 2012-08-31
  • 2020-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-23
相关资源
最近更新 更多