现在我使用 cx_oracle 和 python 来执行 oracle 语句。我有 Oracle CDB 和 PDB。我需要从CDB到PDB(MYPDB)执行这条语句
更改会话集容器=MYPDB; SELECT (SELECT instance_name FROM v$instance) as CDB_NAME, (SELECT SYS_CONTEXT('USERENV', 'CON_NAME') FROM Dual) as PDB_NAME ,a.owner ,a.table_name ,a.column_name ,b.comments FROM dba_tab_columns a LEFT JOIN dba_col_comments b ON a.owner = b.owner AND a.table_name = b.table_name AND a.column_name = b.column_name WHERE a.OWNER LIKE 'USR_%' 按 a.owner、a.table_name、a.column_name ASC
它在 sql Developer 中有效,但在 cx_oracle 中无效。我的脚本是:
conn = cx_Oracle.connect(用户=self.user, 密码=self.password, dsn=self.connection_string)
光标 = conn.cursor()
cursor.execute("""改变会话集 CONTAINER=PB24 SELECT a.owner, a.table_name, b.comments FROM dba_tables a LEFT JOIN dba_tab_comments b ON a.owner = b.owner AND a.table_name = b.table_name WHERE a.OWNER LIKE 'USR_%' ORDER BY a.owner, a.表名ASC; “””)
并返回 ORA-00922: 缺少或无效选项
Python版本:3.10.14 甲骨文版本:18g cx_版本:8最新
给出具体答案来解释对问题的评论:
安装python-oracledb:
$ python3 -m pip install oracledb --upgrade
设置下面脚本中使用的环境变量,然后运行它:
import getpass
import os
import oracledb
un = os.environ.get('PYTHON_USERNAME')
cs = os.environ.get('PYTHON_CONNECTSTRING')
pw = getpass.getpass(f'Enter password for {un}@{cs}: ')
with oracledb.connect(user=un, password=pw, dsn=cs) as connection:
with connection.cursor() as cursor:
sql1 = "ALTER SESSION SET CONTAINER=MYPDB"
cursor.execute(sql1)
sql2 = """select
(
select
instance_name
from
v$instance
) as cdb_name,
(
select
sys_context('USERENV', 'CON_NAME')
from
dual
) as pdb_name,
a.owner,
a.table_name,
a.column_name,
b.comments
from
dba_tab_columns a
left join dba_col_comments b
on a.owner = b.owner
and a.table_name = b.table_name
and a.column_name = b.column_name
where
a.owner like 'USR_%'
order by
a.owner,
a.table_name,
a.column_name asc"""
for r in cursor.execute(sql2):
print(r)