python调用oracle的sql中wm_concat问题:

selectsubsystemcode系统ID,to_char(wm_concat(monacc))as各月新增案例数from(selectsubsystemcode,t... select subsystemcode 系统ID,
to_char(wm_concat(monacc)) as 各月新增案例数
from (
select subsystemcode ,
to_char(create_date,'yyyy-mm') ||':'||count(1) as monacc
from TMS.DIMTESTCASE t
where t.subsystemcode IN( '830020','866252')
and t.create_date >= to_date('20160101','yyyymmdd')
group by subsystemcode, to_char(create_date,'yyyy-mm')
order by subsystemcode, to_char(create_date,'yyyy-mm')
)
group by subsystemcode
在pl/sql中执行上面的语句没有问题,但是通过python的cx_Oracle执行这个sql且在t.subsystemcode in ()中的值大于1个时就会发生ORA-22922的报错:
展开
 我来答
龙氏风采
2016-12-26 · 知道合伙人互联网行家
龙氏风采
知道合伙人互联网行家
采纳数:5849 获赞数:12816
从事互联网运营推广,5年以上互联网运营推广经验,丰富的实战经

向TA提问 私信TA
展开全部
  利用python调用sqlplus来输出结果的例子:
  import os
  import sys
  from subprocess import Popen, PIPE
  sql = """
  set linesize 400
  col owner for a10
  col object_name for a30
  select owner, object_name
  from dba_objects
  where rownum<=10;
  """
  proc = Popen(["sqlplus", "-S", "/", "as", "sysdba"], stdout=PIPE, stdin=PIPE, stderr=PIPE)
  proc.stdin.write(sql)
  (out, err) = proc.communicate()
  if proc.returncode != 0:
  print err
  sys.exit(proc.returncode)
  else:
  print out
  用Python查询Oracle,当然最好用cx_Oracle库,但有时候受到种种限制,不能安装Python第三方库,就得利用现有资源,硬着头皮上了。
  用Python调用SqlPlus查询Oracle,首先要知道SqlPlus返回结果是什么样的:
  (这是空行)
  Number Name Address
  ------------ ----------- ------------------
  1001 张三 南京路
  1002 李四 上海路
  第1行是空行,第2行是字段名称,第3行都是横杠,有空格隔开,第4行开始是查询到的结果。
  在查询结果规整的情况下,根据第3行可以很清晰的看到结构,用Python解析起来也比较方便。但是,如果一张表字段特别多,记录数也相当多,那么默认情况下调用SqlPlus查询出的结果会比较乱,这就需要在调用查询之前做一些设定,比如:
  set linesize 32767
  set pagesize 9999
  set term off verify off feedback off tab off
  set numwidth 40
  这样的调用查询结果就比较规整了。接下来就是用强大的Python来解析查询结果。
  这里封装了一个函数,可以根据传入的SQL语句查询并解析结果,将每行结果存到列表中,列表中的每个元素是一个字段名称与值的映射。
  #!/usr/bin/python
  #coding=UTF-8
  '''
  @author: 双子座@开源中国
  @summary: 通过SqlPlus查询Oracles数据库
  '''
  import os;
  os.environ['NLS_LANG'] = 'AMERICAN_AMERICA.AL32UTF8'
  gStrConnection = 'username/password@10.123.5.123:1521/ora11g'
  #解析SqlPlus的查询结果,返回列表
  def parseQueryResult(listQueryResult):
  listResult = []
  #如果少于4行,说明查询结果为空
  if len(listQueryResult) < 4:
  return listResult
  #第0行是空行,第1行可以获取字段名称,第2行可获取SQLPlus原始结果中每列宽度,第3行开始是真正输出
  # 1 解析第2行,取得每列宽度,放在列表中
  listStrTmp = listQueryResult[2].split(' ')
  listIntWidth = []
  for oneStr in listStrTmp:
  listIntWidth.append(len(oneStr))
  # 2 解析第1行,取得字段名称放在列表中
  listStrFieldName = []
  iLastIndex = 0
  lineFieldNames = listQueryResult[1]
  for iWidth in listIntWidth:
  #截取[iLastIndex, iLastIndex+iWidth)之间的字符串
  strFieldName = lineFieldNames[iLastIndex:iLastIndex + iWidth]
  strFieldName = strFieldName.strip() #去除两端空白符
  listStrFieldName.append(strFieldName)
  iLastIndex = iLastIndex + iWidth + 1
  # 3 第3行开始,解析结果,并建立映射,存储到列表中
  for i in range(3, len(listQueryResult)):
  oneLiseResult = unicode(listQueryResult[i], 'UTF-8')
  fieldMap = {}
  iLastIndex = 0
  for j in range(len(listIntWidth)):
  strFieldValue = oneLiseResult[iLastIndex:iLastIndex + listIntWidth[j]]
  strFieldValue = strFieldValue.strip()
  fieldMap[listStrFieldName[j]] = strFieldValue
  iLastIndex = iLastIndex + listIntWidth[j] + 1
  listResult.append(fieldMap)
  return listResult
  def QueryBySqlPlus(sqlCommand):
  global gStrConnection
  #构造查询命令
  strCommand = 'sqlplus -S %s <<!\n' % gStrConnection
  strCommand = strCommand + 'set linesize 32767\n'
  strCommand = strCommand + 'set pagesize 9999\n'
  strCommand = strCommand + 'set term off verify off feedback off tab off \n'
  strCommand = strCommand + 'set numwidth 40\n'
  strCommand = strCommand + sqlCommand + '\n'
  #调用系统命令收集结果
  result = os.popen(strCommand)
  list = []
  for line in result:
  list.append(line)
  return parseQueryResult(list)
  其中os.environ['NLS_LANG']的值来自
  select userenv['language'] from dual;
  在调用的时候,只要类似:
  listResult = QueryBySqlPlus('select * from studentinfo')
  然后就可以用循环打印出结果了。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式