【问题标题】:How to implement DBMS_METADATA.GET_DDL in cx_Oracle and python3 and get the ddl of the table?如何在cx_Oracle和python3中实现DBMS_METADATA.GET_DDL并获取表的ddl?
【发布时间】:2020-03-18 05:53:01
【问题描述】:

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

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

现在如何使用cx_Oraclepython3 获取表的ddl。

请帮忙。我无法提取 ddl。

【问题讨论】:

    标签: python python-3.x oracle oracle11g cx-oracle


    【解决方案1】:

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

    【讨论】:

    • 感谢 Anthony 学习这个,这个答案非常好,我删除了我的。
    • 没问题!很高兴它有帮助。
    【解决方案2】:

    cx_Oracle 原生支持调用 PL/SQL。

    假设你有连接和游标对象,sn-p 将如下所示:

    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 块,因为 Python 的 str 没有此限制。为了在一个块中获取 DDL,只需将 returnType 设置为 cx_Oracle.CLOB。您可以稍后通过 str(ddl) 将其转换为 str

    【讨论】:

    • 非常感谢先生的所有努力。先生,您能建议我在哪里可以在 python3 中学习高级 cx_Oracle
    • @HemaVarunKumarPenaganti 文档非常适合作为起点cx-oracle.readthedocs.io/en/latest
    猜你喜欢
    • 2013-01-14
    • 2017-11-03
    • 2016-11-15
    • 2019-10-19
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 2018-12-01
    • 2014-06-01
    相关资源
    最近更新 更多