这是我正在使用的oracle命令:-
query = '''SELECT DBMS_METADATA.GET_DDL('TABLE', 'MY_TABLE', 'MY_SCHEMA') FROM DUAL;'''
cur.execute(query)
现在如何使用cx_Oracle
和python3
获取表的ddl。
请帮助。我无法提取ddl。
首先,您当然需要一个可以通过cx_Oracle.connect
确定的连接。
然后,是的,您可以使用DBMS_METADATA.GET_DDL()
函数,但是问题在于此函数返回CLOB
,而该函数无法通过使用python的print()
方法直接打印。因此,应使用TO_CHAR()
函数将其转换为经典字符串。但是,这里出现了另一个问题,即TO_CHAR(<str>)
的最大长度为4000。因此,我们需要在数据库中应用SUBSTR()
函数。为了动态应用拆分,我们需要Oracle的CONNECT BY LEVEL >= ..
语法。因此,您可以使用以下代码:
import cx_Oracle
con = cx_Oracle.connect('my_schema/pwd@dns_name:port_number/db_alias')
cur = con.cursor()
query = "SELECT TO_CHAR( SUBSTR( DBMS_METADATA.GET_DDL('TABLE', 'MY_TABLE', 'MY_SCHEMA'), 1+4000*(LEVEL-1), 4000 ) ) AS STR"
query += " FROM DUAL "
query += "CONNECT BY LEVEL <= CEIL( DBMS_LOB.GETLENGTH(DBMS_METADATA.GET_DDL('TABLE', 'MY_TABLE', 'MY_SCHEMA'))/4000 ) "
cur.execute(query)
print(cur.fetchall())