0

这是我正在使用的 oracle 命令:-

query = '''SELECT DBMS_METADATA.GET_DDL('TABLE', 'MY_TABLE', 'MY_SCHEMA') FROM DUAL;'''
cur.execute(query)

现在如何使用cx_Oracleand获取表的 ddl python3

请帮忙 。我无法提取 ddl。

4

2 回答 2

2

以下代码可用于从 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 个字符。

于 2019-11-23T22:50:52.403 回答
1

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,只需设置returnTypecx_Oracle.CLOB. 您可以稍后str通过执行将其转换为str(ddl).

于 2019-11-25T01:18:46.247 回答