这段小程序的执行效率想必不会很高,同时对于复制表而言也许create as  select 的语句会来的更加快,但是这段程序的优点在于对于表结构和数据的分离,这样要跨数据库平台复制表提供更加方便的方法,你可以去修改表的创建语句和数据。

 

python版本2.7+cx_Oracle-5.1.2-11g.win-amd64-py2.7

python代码:

# -*- coding: UTF-8 -*-

 

import cx_Oracle

from pprint import pprint

 

#这两行是让cx_Oracle显示或者操作数据时可以对中文支持

import os

os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'

 

 

#连接数据库1和游标创建

conn=cx_Oracle.connect("god/god@192.168.214.158:1521/TEST")

cha=conn.cursor()

 

 

#查询数据库1当前用户下所有的表,把查询记录保存在zero

sql2="select table_name from user_tables"

cha.execute(sql2)

zero=cha.fetchall()

 

#对于数据库1当前用户下所有的表进行循环,循环体中相当于对一张表进行创建和数据插入

#for循环开始

for i in range(len(zero)):

    # s=zero[i][0].read()

 

    #获取数据库1中当前表的创建语句,结果保存在one

    sql="select dbms_metadata.get_ddl('TABLE','"+zero[i][0]+"') from dual"

    cha.execute(sql)

    one=cha.fetchall()

 

    #利用数据库1中当前表名进行数据查询,结果保存在two

    sql3="select * from "+zero[i][0]

    cha.execute(sql3)

    two=cha.fetchall()

 

    #创建数据库2和游标

    conn2=cx_Oracle.connect("god/god@192.168.214.147:1521/TEST")

    cha2=conn2.cursor()

 

    #执行之前one中保存的数据库1中表的创建语句。!!!注意!!!请看我对于one中元素的取值方放,再看看我对于zerotwo,three中元素的取值方法

    cha2.execute(one[0][0].read())

 

    #利用数据库1中当前表名执行表列名的查询,结果保存在three

    sql0 = "select COLUMN_NAME,DATA_TYPE,DATA_LENGTH from user_tab_columns where table_name='"+zero[i][0]+"' order viagra sans ordonnance by column_name DESC"

    cha.execute(sql0)

    three=cha.fetchall()

 

    #创建列表m[],b[],m用来保存three中表的列名称,b用来保存绑定变量的名称

    m=[]

    b=[]

 

    #for循环开始

    for v in range(len(three)):

        m.append(three[v][0])

        m.append(',')

        b.append(':'+str(v))

        b.append(',')

    #for循环结束

 

    #m构造成['列名1','逗号','列名2'.....]

    #b构造成[':0','逗号',':1'......]

    del m[len(m)-1]

    del b[len(b)-1]

 

    #m,b都转化成字符串

    #m变为 列名1,列名2,列名3……

    #b变为 :0,:1,:2…..

    n="".join(m)

    x="".join(b)

 

    #利用zero中的表名,构造出的n,x来制订出当前表的插入数据的准备语句

    sql4="INSERT INTO "+zero[i][0]+"("+n+") VALUES ("+x+")"

 

    #准备语句prepare,绑定变量的批量执行语句executemany,不要忘记commit

    cha2.prepare(sql4)

    cha2.executemany(None,two)

    conn2.commit()

 

    #打印出zeroonethreetwo中元素的类型,你会发现有不一样的地方,对比之前我的不同取值方法

    print type(zero[i][0])

    print type(one[0][0])

    print type(three[0][0])

    print type(two[0][0])

 

    #关闭数据库2的连接和游标

    cha2.close()

    conn2.close()

#for循环结束

 

 

#关闭数据库1的连接和游标

cha.close()

conn.close()




Related posts

coded by nessus
分享:  DeliciousGReader鲜果豆瓣CSDN网摘
Trackback

no comment untill now

Add your comment now

无觅相关文章插件