这是我正在使用的 oracle 命令:-
query = '''SELECT DBMS_METADATA.GET_DDL('TABLE', 'MY_TABLE', 'MY_SCHEMA') FROM DUAL;'''
cur.execute(query)
现在如何使用cx_Oracleand获取表的 ddl python3。
请帮忙 。我无法提取 ddl。
这是我正在使用的 oracle 命令:-
query = '''SELECT DBMS_METADATA.GET_DDL('TABLE', 'MY_TABLE', 'MY_SCHEMA') FROM DUAL;'''
cur.execute(query)
现在如何使用cx_Oracleand获取表的 ddl python3。
请帮忙 。我无法提取 ddl。
以下代码可用于从 dbms_metadata 获取 DDL 的内容:
import cx_Oracle
conn = cx_Oracle.connect("username/password@hostname/myservice")
cursor = conn.cursor()
def OutputTypeHandler(cursor, name, defaultType, size, precision, scale):
if defaultType == cx_Oracle.CLOB:
return cursor.var(cx_Oracle.LONG_STRING, arraysize = cursor.arraysize)
cursor.outputtypehandler = OutputTypeHandler
cursor.execute("select dbms_metadata.get_ddl('TABLE', :tableName) from dual",
tableName="THE_TABLE_NAME")
text, = cursor.fetchone()
print("DDL fetched of length:", len(text))
print(text)
使用输出类型处理程序是为了消除处理 CLOB 的需要。没有它,您将需要做str(lob)或lob.read()才能获得其内容。但是,无论哪种方式,您都不会限制为 4,000 个字符。
cx_Oracle 对调用 PL/SQL 有本机支持。
假设您有连接和游标对象,代码片段将如下所示:
binds = dict(object_type='TABLE', name='DUAL', schema='SYS')
ddl = cursor.callfunc('DBMS_METADATA.GET_DDL', keywordParameters=binds, returnType=cx_Oracle.CLOB)
print(ddl)
您不需要将 DDL 拆分为 4k/32k 块,因为 Pythonstr没有此限制。为了在一个块中获取 DDL,只需设置returnType为cx_Oracle.CLOB. 您可以稍后str通过执行将其转换为str(ddl).