在 cx_Oracle 中跨 Oracle Schema 进行查询

Posted

技术标签:

【中文标题】在 cx_Oracle 中跨 Oracle Schema 进行查询【英文标题】:Querying across Oracle Schema's in cx_Oracle 【发布时间】:2014-08-28 05:19:33 【问题描述】:

我可以使用sqlplus 登录我的oracle 实例:

$ env | grep -E '(TWO|SID)'
TWO_TASK=TEST
$ sqlplus me/my_password@TEST

然后我可以毫无问题地运行以下查询:

select 
  persons.person.key AS id,
  persons.person.lname as lastname,
  persons.person.fname as firstname,
  sid.organizations.org_code as org,
  sid.organizations.division_code as division,
  sid.organizations.directorate_code as directorate,
  persons.person.status as status
from
   persons.person,
   sid.organizations
where
   persons.person.dept_id=sid.organizations.org_id;

但是,在我的 python 代码中,使用cx_Oracle,并带有以下代码(即相同的查询):

def get_oracle( user, password, tns='TEST' ):
    db = cx_Oracle.connect( user, password, tns )
    cursor = db.cursor()
    return cursor

db = get_oracle( 'me', 'my_pass' )
db.execute("""
select
  persons.person.key AS id,
  persons.person.lname as lastname,
  persons.person.fname as firstname,
  sid.organizations.org_code as org,
  sid.organizations.division_code as division,
  sid.organizations.directorate_code as directorate,
  persons.person.status as status
from
   persons.person,
   sid.organizations
where
   persons.person.dept_id=sid.organizations.org_id;
""")
for r in db:
    pass

结果得到以下错误:

cx_Oracle.DatabaseError: ORA-00911: invalid character

我很确定我的连接很好,因为其他查询工作正常。

【问题讨论】:

您为什么认为这与存在于不同模式中的表有关?语句末尾有一个分号,它不是 SQL 语句的一部分(这是告诉 SQL*Plus 您已完成输入 SQL 语句的一种方式)。我也想不通为什么你的字符串开头和结尾都有三个双引号字符——为什么不像你在代码中使用所有其他字符串那样只使用一个单引号字符来分隔字符串? 3 个双引号字符对于多行 Python 字符串 @Justin 来说是相当标准的。问题是您描述的分号。 谢谢贾斯汀,是的 - 只是一个愚蠢的错字! 【参考方案1】:

回答我自己的问题,这是一个愚蠢的错字,查询末尾带有分号!

【讨论】:

以上是关于在 cx_Oracle 中跨 Oracle Schema 进行查询的主要内容,如果未能解决你的问题,请参考以下文章

python之Oracle操作(cx_Oracle)

使用 cx_oracle 批量下载表

oracle 错误代码处理 cx_oracle

python 连接oracle(cx_Oracle模块)

第八篇:cx_Oracle出现的问题

使用Python解决Cx_Oracle查询时UnicodeDecodeError的问题