使用 CX_Oracle 更改会话集 CONTAINER

问题描述 投票:0回答:1

现在我使用 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-3.x oracle cx-oracle
1个回答
0
投票

给出具体答案来解释对问题的评论:

安装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)
© www.soinside.com 2019 - 2024. All rights reserved.