首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在cx_Oracle和python3中实现DBMS_METADATA.GET_DDL并获取表的动态链接库?

如何在cx_Oracle和python3中实现DBMS_METADATA.GET_DDL并获取表的动态链接库?
EN

Stack Overflow用户
提问于 2019-11-22 15:31:26
回答 2查看 883关注 0票数 0

这是我使用的oracle命令:-

代码语言:javascript
运行
复制
query = '''SELECT DBMS_METADATA.GET_DDL('TABLE', 'MY_TABLE', 'MY_SCHEMA') FROM DUAL;'''
cur.execute(query)

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

请帮帮忙。我无法提取ddl。

EN

回答 2

Stack Overflow用户

发布于 2019-11-24 06:50:52

以下代码可用于从dbms_metadata获取DDL的内容:

代码语言:javascript
运行
复制
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()才能获取其内容。但是,无论哪种方式,您都不会被限制在4000个字符以内。

票数 2
EN

Stack Overflow用户

发布于 2019-11-25 09:18:46

cx_Oracle具有对调用PL/SQL的本机支持。

假设您有connection和cursor对象,代码片段将如下所示:

代码语言:javascript
运行
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58989485

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档