返回列表 发帖

Python3脚本管理Oracle11gR2

笺注:这是在 Navicat连接Oracle11gR2 的基础上进行的。


相关软件的下载链接:https://pan.baidu.com/s/1Bip6wckcZ8eEiMoJIii4lA  提取码:mwoi



Oracle Linux6.9安装Python3:

安装依赖软件包:(以本地光盘作为Yum源即可)
[root@oracle ~]# yum -y install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel wget gcc-c++ make


编译安装Python3:
tar -zxvf Python-3.6.8.tgz
mv Python-3.6.8 /usr/local/
cd /usr/local/Python-3.6.8/
./configure
make
make install


给新Python3创建新链接:
[root@oracle ~]# ln -s /usr/local/bin/python3.6 /usr/bin/python3


Python2和Python3实现共存了:
图片1.png
2022-7-7 08:55




Oracle服务器连接公网安装第三方库(cx_Oracle):(可以指定软件的版本)
[root@oracle ~]# pip3 install cx_Oracle==8.0.1 -i http://mirrors.aliyun.com/pypi/simple --trusted-host=mirrors.aliyun.com
Looking in indexes: http://mirrors.aliyun.com/pypi/simple
Collecting cx_Oracle==8.0.1
  Downloading http://mirrors.aliyun.com/pypi/packages/9f/ce/9117cc84d05800b7962f1842bf5fb20455ee08264cda052a3c79d476cf01/cx_Oracle-8.0.1-cp36-cp36m-manylinux1_x86_64.whl (756kB)
    100% |████████████████████████████████| 757kB 4.3MB/s
Installing collected packages: cx-Oracle
Successfully installed cx-Oracle-8.0.1
[root@oracle ~]#


列出当前环境所有已经安装的第三方库的名称和其版本号:
[root@oracle ~]# pip3 freeze
cx-Oracle==8.0.1
[root@oracle ~]#


由此还可以得获得第三方库(cx_Oracle)的下载地址:(需要另外手动下载软件包)
[root@oracle ~]# wget http://mirrors.aliyun.com/pypi/packages/9f/ce/9117cc84d05800b7962f1842bf5fb20455ee08264cda052a3c79d476cf01/cx_Oracle-8.0.1-cp36-cp36m-manylinux1_x86_64.whl


软件包下载成功:
[root@oracle ~]# du -sh cx_Oracle-8.0.1-cp36-cp36m-manylinux1_x86_64.whl
740K    cx_Oracle-8.0.1-cp36-cp36m-manylinux1_x86_64.whl
[root@oracle ~]#



######

例子一:
Oracle服务器本地测试与数据库连接的脚本:(/root/xx.py)
[root@oracle ~]# cat xx.py
#coding=utf-8
import cx_Oracle

def db_connect():

        #本地连接数据库;使用数据库用户happy,数据库实例ORCL
        db=cx_Oracle.connect('happy/mima@127.0.0.1:1521/ORCL')
       
        cursor = db.cursor()
       
        Sql_1 = "SELECT version FROM product_component_version WHERE substr(product, 1, 6) = 'Oracle'" #查看数据库版本信息
        cursor.execute(Sql_1)
       
        Result_1 = cursor.fetchone() #使用fetchone只能获取一个元素
       
        print(Result_1)
        print(type(Result_1))
       
        print("-" * 10)
        print(Result_1[0]) #输出元组的第一个元素
       
        print("-" * 10)
        print(f"数据库的版本信息:{Result_1[0]}")
       
        db.close() #关闭数据库连接

def func_main():
        try:
                db_connect()
        except Exception as e:
                print(f"数据库连接失败,原因: {e}")

if __name__ == "__main__":

        func_main()


脚本运行的结果:
[root@oracle ~]# python3 xx.py
数据库连接失败,原因: DPI-1047: Cannot locate a 64-bit Oracle Client library: "libclntsh.so: cannot open shared object file: No such file or directory". See https://cx-oracle.readthedocs.io/en/latest/user_guide/installation.html for help
[root@oracle ~]#


根据提示登录网站查看文档,下载软件包:
https://cx-oracle.readthedocs.io/en/latest/user_guide/installation.html


安装相关RPM包(CentOS6/Redhat6要安装oracle-instantclient18.3-basic):
[root@oracle ~]# rpm -ivh oracle-instantclient18.3-basic-18.3.0.0.0-3.x86_64.rpm
warning: oracle-instantclient18.3-basic-18.3.0.0.0-3.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID ec551f03: NOKEY
Preparing...                ########################################### [100%]
   1:oracle-instantclient18.########################################### [100%]
[root@oracle ~]#

[root@oracle ~]# sudo sh -c "echo /usr/lib/oracle/18.3/client64/lib > /etc/ld.so.conf.d/oracle-instantclient.conf"
[root@oracle ~]#

[root@oracle ~]# cat /etc/ld.so.conf.d/oracle-instantclient.conf
/usr/lib/oracle/18.3/client64/lib
[root@oracle ~]#

[root@oracle ~]# sudo ldconfig
[root@oracle ~]#


脚本运行的结果:(连接成功时)
[root@oracle ~]# python3 xx.py
('11.2.0.1.0',)
<class 'tuple'>
----------
11.2.0.1.0
----------
数据库的版本信息:11.2.0.1.0
[root@oracle ~]#


脚本运行的结果:(因用户密码错误,连接失败时)
[root@oracle ~]# python3 xx.py
数据库连接失败,原因: ORA-01017: invalid username/password; logon denied
[root@oracle ~]#



######

数据库用户happy已有的表STU_01的表结构:
图片2.png
2022-7-7 09:03



例子二:
Oracle服务器本地一次性插入多条记录的脚本:
[root@oracle ~]# cat xx.py
#coding=utf-8
import cx_Oracle

import datetime
dt = datetime.datetime.now()
tt_1 = dt.strftime('%Y-%m-%d %H:%M:%S') #当前时间

def insert_record():
        global db
        db=cx_Oracle.connect('happy/mima@127.0.0.1:1521/ORCL')
        cursor = db.cursor()
       
        Sql_1 = "INSERT into STU_01 (ID,NAME,AGE,GRADE,ADDRESS,MATH,CHINESE,SHIJIAN)" \
        " values (1,'小明',15,'三年二班','广东省,广州市',60.5,70.5,to_timestamp('2020-10-5 19:3:15','yyyy-mm-ddhh24:mi:ss'))"
        cursor.execute(Sql_1)
       
       
        Key_1 = 2
        Key_2 = '李大杰'
        Key_3 = 16
        Key_4 = '三年二班'
        Key_5 = '广东省,佛山市'
        Key_6 = 66
        Key_7 = 78
        Key_8 = "to_timestamp('2020-10-06 10:23:15','yyyy-mm-ddhh24:mi:ss')"
       
        Sql_2 = f"INSERT into STU_01 (ID,NAME,AGE,GRADE,ADDRESS,MATH,CHINESE,SHIJIAN) VALUES({Key_1},'{Key_2}',{Key_3},'{Key_4}','{Key_5}',{Key_6},{Key_7},{Key_8})"
        cursor.execute(Sql_2)

       
        Key_1 = 3
        Key_2 = 'Zhuohua'
        Key_3 = 18
        Key_4 = '三年十二班'
        Key_5 = '四川省,成都市'
        Key_6 = 100
        Key_7 = 99
        Key_8 = f"to_timestamp('{tt_1}','yyyy-mm-ddhh24:mi:ss')"
               
        Sql_3 = f"INSERT into STU_01 (ID,NAME,AGE,GRADE,ADDRESS,MATH,CHINESE,SHIJIAN) VALUES({Key_1},'{Key_2}',{Key_3},'{Key_4}','{Key_5}',{Key_6},{Key_7},{Key_8})"
        cursor.execute(Sql_3)
               
        db.commit() #把执行任务提交到数据库;必须是所有SQL语句都执行成功才会提交
        db.close()
               
def func_main():
        try:
                insert_record()
        except Exception as e:
                print(f"插入记录失败,原因: {e}")
                db.rollback() #如果发生错误就回滚
        else:
                print("插入记录成功。")
               
if __name__ == "__main__":

        func_main()

[root@oracle ~]#


脚本运行的结果:
[root@oracle ~]# python3 xx.py
插入记录成功。
[root@oracle ~]#


插入记录成功:
图片3.png
2022-7-7 09:04




######

例子三:
Oracle服务器本地输出数据库中某个表的所有记录的脚本:
[root@oracle ~]# cat xx.py
#coding=utf-8
import cx_Oracle

def query_data():
        db=cx_Oracle.connect('happy/mima@127.0.0.1:1521/ORCL')
        cursor = db.cursor()
               
        Sql_1 = "select * from STU_01" #输出表STU_01中的所有记录
        cursor.execute(Sql_1)
       
        Result_1 = cursor.fetchall() #使用fetchall可以获取多个元素
        print(Result_1)
        print(type(Result_1))
       
        print("-" * 10)
       
        for Key_1 in Result_1: #自定义输出格式
                ID = Key_1[0]
                NAME = Key_1[1]
                AGE = Key_1[2]
               
                GRADE = Key_1[3].strip() #去除左边和右边的空格、换行符
                ADDRESS = Key_1[4]
                MATH = Key_1[5]
                CHINESE = Key_1[6]
               
                SHIJIAN = str(Key_1[7])

                print(f"id={ID} && 姓名={NAME} && 年龄={AGE} && 班级={GRADE} && 地址={ADDRESS} && 数学成绩={MATH} && 语文成绩={CHINESE} && 时间={SHIJIAN}")
                       
        db.commit() #把执行任务提交到数据库
        db.close()

def func_main():
        try:
                query_data()
        except Exception as e:
                print(f"输出失败,原因: {e}")

if __name__ == "__main__":

        func_main()

[root@oracle ~]#


脚本运行的结果:
[root@oracle ~]# python3 xx.py
[(1, '小明', 15, '三年二班                                                                                        ', <cx_Oracle.LOB object at 0x7f45015dc8f0>, 60.5, 70.5, datetime.datetime(2020, 10, 5, 19, 3, 15)), (2, '李大杰', 16, '三年二班                                                                                        ', <cx_Oracle.LOB object at 0x7f45015dc8a0>, 66.0, 78.0, datetime.datetime(2020, 10, 6, 10, 23, 15)), (3, 'Zhuohua', 18, '三年十二班                                                                                     ', <cx_Oracle.LOB object at 0x7f44f9f643a0>, 100.0, 99.0, datetime.datetime(2020, 10, 29, 8, 33))]
<class 'list'>
----------
id=1 && 姓名=小明 && 年龄=15 && 班级=三年二班 && 地址=广东省,广州市 && 数学成绩=60.5 && 语文成绩=70.5 && 时间=2020-10-05 19:03:15
id=2 && 姓名=李大杰 && 年龄=16 && 班级=三年二班 && 地址=广东省,佛山市 && 数学成绩=66.0 && 语文成绩=78.0 && 时间=2020-10-06 10:23:15
id=3 && 姓名=Zhuohua && 年龄=18 && 班级=三年十二班 && 地址=四川省,成都市 && 数学成绩=100.0 && 语文成绩=99.0 && 时间=2020-10-29 08:33:00
[root@oracle ~]#



######

例子四:
Oracle服务器本地输出数据库中某个表里符合指定条件的记录的脚本:
[root@oracle ~]# cat xx.py
#coding=utf-8
import cx_Oracle

def query_data():
        db=cx_Oracle.connect('happy/mima@127.0.0.1:1521/orcl')
        cursor = db.cursor()
               
        Sql_1 = "select * from STU_01 where GRADE = '三年二班'" #SQL语句
        cursor.execute(Sql_1)
       
        Result_1 = cursor.fetchall()
       
        for Key_1 in Result_1: #自定义输出格式
                ID = Key_1[0]
                NAME = Key_1[1]
                AGE = Key_1[2]
               
                GRADE = Key_1[3].rstrip() #单单去除右边的空格、换行符
                ADDRESS = Key_1[4]
                MATH = Key_1[5]
                CHINESE = Key_1[6]
               
                SHIJIAN = str(Key_1[7])

                print(f"id={ID} && 姓名={NAME} && 年龄={AGE} && 班级={GRADE} && 地址={ADDRESS} && 数学成绩={MATH} && 语文成绩={CHINESE} && 时间={SHIJIAN}")
                       
        db.commit() #把执行任务提交到数据库
        db.close()

def func_main():
        try:
                query_data()
        except Exception as e:
                print(f"输出失败,原因: {e}")

if __name__ == "__main__":

        func_main()

[root@oracle ~]#


脚本运行的结果:
[root@oracle ~]# python3 xx.py
id=1 && 姓名=小明 && 年龄=15 && 班级=三年二班 && 地址=广东省,广州市 && 数学成绩=60.5 && 语文成绩=70.5 && 时间=2020-10-05 19:03:15
id=2 && 姓名=李大杰 && 年龄=16 && 班级=三年二班 && 地址=广东省,佛山市 && 数学成绩=66.0 && 语文成绩=78.0 && 时间=2020-10-06 10:23:15
[root@oracle ~]#



######

例子五:
Oracle服务器本地输出根据关键字搜索出来的记录的脚本:(结果只取一个值)
[root@oracle ~]# cat xx.py
#coding=utf-8
import cx_Oracle

def query_data():
        db=cx_Oracle.connect('happy/mima@127.0.0.1:1521/orcl')
        cursor = db.cursor()
               
        Sql_1 = "select * from STU_01 where NAME = 'Zhuohua'" #关键字区分英文字母大小写
        cursor.execute(Sql_1)
       
        Result_1 = cursor.fetchall()
       
        for Key_1 in Result_1: #自定义输出格式
                ID = Key_1[0]
                NAME = Key_1[1]
                AGE = Key_1[2]
               
                GRADE = Key_1[3].rstrip() #单单去除右边的空格、换行符
                ADDRESS = Key_1[4]
                MATH = Key_1[5]
                CHINESE = Key_1[6]
               
                SHIJIAN = str(Key_1[7])

                print(f"id={ID} && 姓名={NAME} && 年龄={AGE} && 班级={GRADE} && 地址={ADDRESS} && 数学成绩={MATH} && 语文成绩={CHINESE} && 时间={SHIJIAN}")
                       
        print("-" * 10)
        print(f"{NAME}的年龄:")
        print(AGE)
        print(type(AGE))
       
        db.commit() #把执行任务提交到数据库
        db.close()

def func_main():
        try:
                query_data()
        except Exception as e:
                print(f"输出失败,原因: {e}")

if __name__ == "__main__":

        func_main()

[root@oracle ~]#


脚本运行的结果:
[root@oracle ~]# python3 xx.py
id=3 && 姓名=Zhuohua && 年龄=18 && 班级=三年十二班 && 地址=四川省,成都市 && 数学成绩=100.0 && 语文成绩=99.0 && 时间=2020-10-29 08:33:00
----------
Zhuohua的年龄:
18
<class 'int'>

[root@oracle ~]#



######

例子六:
Oracle服务器本地输出根据关键字搜索出来的记录的脚本:(结果只取一个值)
[root@oracle ~]# cat xx.py
#coding=utf-8
import cx_Oracle

def query_data():
        db=cx_Oracle.connect('happy/mima@127.0.0.1:1521/ORCL')
        cursor = db.cursor()
               
        Sql_1 = "select * from STU_01 where NAME = 'Zhuohua'"
        cursor.execute(Sql_1)
       
        Result_1 = cursor.fetchall()
       
        for Key_1 in Result_1: #自定义输出格式
                ID = Key_1[0]
                NAME = Key_1[1]
                AGE = Key_1[2]
               
                GRADE = Key_1[3].rstrip() #单单去除右边的空格、换行符
                ADDRESS = Key_1[4]
                MATH = Key_1[5]
                CHINESE = Key_1[6]
               
                SHIJIAN = str(Key_1[7])

                print(f"id={ID} && 姓名={NAME} && 年龄={AGE} && 班级={GRADE} && 地址={ADDRESS} && 数学成绩={MATH} && 语文成绩={CHINESE} && 时间={SHIJIAN}")
       
        print("-" * 10)
        print(f"{Result_1[0][1]}的语文成绩:")
        print(Result_1[0][6])
        print(type(Result_1[0][6]))
       
        db.commit() #把执行任务提交到数据库
        db.close()

def func_main():
        try:
                query_data()
        except Exception as e:
                print(f"输出失败,原因: {e}")

if __name__ == "__main__":

        func_main()

[root@oracle ~]#


脚本运行的结果:
[root@oracle ~]# python3 xx.py
id=3 && 姓名=Zhuohua && 年龄=18 && 班级=三年十二班 && 地址=四川省,成都市 && 数学成绩=100.0 && 语文成绩=99.0 && 时间=2020-10-29 08:33:00
----------
Zhuohua的语文成绩:
99.0
<class 'float'>

[root@oracle ~]#



######

例子七:
Oracle服务器本地输出根据关键字搜索出来的记录的脚本:(结果只取一个值)
[root@oracle ~]# cat xx.py
#coding=utf-8
import cx_Oracle

def query_data():
        db=cx_Oracle.connect('happy/mima@127.0.0.1:1521/ORCL')
        cursor = db.cursor()
               
        Sql_1 = "select * from STU_01 where NAME = 'Zhuohua'"
        cursor.execute(Sql_1)
       
        Result_1 = cursor.fetchall()
       
        Result_2 = Result_1[0] #列表的第一个元素,即第一条记录
       
        NAME = Result_2[1]
        CHINESE = Result_2[6]
               
        SHIJIAN = str(Result_2[7])
       
        date = str(Result_2[7])[0:10] #输出前面10个字符
        time = str(Result_2[7])[-8:] #输出最后8个字符

        print(f"姓名={NAME} && 语文成绩={CHINESE} && 具体时间={SHIJIAN} && 日期部分={date} && 时间部分={time}")
       
        print("-" * 10)
        print(f"{Result_1[0][1]}的具体时间:")
        print(SHIJIAN)
        print(type(SHIJIAN))
       
        db.commit() #把执行任务提交到数据库
        db.close()

def func_main():
        try:
                query_data()
        except Exception as e:
                print(f"输出失败,原因: {e}")

if __name__ == "__main__":

        func_main()

[root@oracle ~]#


脚本运行的结果:
[root@oracle ~]# python3 xx.py
姓名=Zhuohua && 语文成绩=99.0 && 具体时间=2020-10-29 08:33:00 && 日期部分=2020-10-29 && 时间部分=08:33:00
----------
Zhuohua的具体时间:
2020-10-29 08:33:00
<class 'str'>

[root@oracle ~]#



######

例子八:
Oracle服务器本地更改记录的脚本:
[root@oracle ~]# cat xx.py
#coding=utf-8
import cx_Oracle

def update_record():

        global db
        db=cx_Oracle.connect('happy/mima@127.0.0.1:1521/ORCL')
        cursor = db.cursor()
       
        Sql_1 = "UPDATE STU_01 SET MATH = 88 WHERE name = 'Zhuohua'" #关键字区分英文字母大小写
        cursor.execute(Sql_1)

        Sql_2 = "UPDATE STU_01 SET ADDRESS = '广东省,江门市' WHERE Name like '__杰%'"
        cursor.execute(Sql_2)

        db.commit() #把执行任务提交到数据库;必须是所有SQL语句都执行成功才会提交
        db.close()
       
def func_main():
        try:
                update_record()
        except Exception as e:
                print(f"更改记录失败,原因: {e}")
                db.rollback() #如果发生错误就回滚
        else:
                print("更改记录成功。")
               
if __name__ == "__main__":

        func_main()

[root@oracle ~]#


脚本运行的结果:
[root@oracle ~]# python3 xx.py
更改记录成功。
[root@oracle ~]#



######

例子九:
Oracle服务器本地更改记录的脚本:
[root@oracle ~]# cat xx.py
#coding=utf-8
import cx_Oracle

import datetime
dt = datetime.datetime.now()
tt_1 = dt.strftime('%Y-%m-%d %H:%M:%S') #当前时间

def update_record():

        global db
        db=cx_Oracle.connect('happy/mima@127.0.0.1:1521/ORCL')
        cursor = db.cursor()
       
        Sql_1 = "UPDATE STU_01 SET SHIJIAN = to_timestamp('2020-10-07 21:24:5','yyyy-mm-ddhh24:mi:ss') WHERE NAME = '李大杰'"
        cursor.execute(Sql_1)
       
        Key_1 = f"to_timestamp('{tt_1}','yyyy-mm-ddhh24:mi:ss')"
        Sql_2 = f"UPDATE STU_01 SET SHIJIAN = {Key_1} WHERE ID = 3"
        cursor.execute(Sql_2)

        db.commit() #把执行任务提交到数据库;必须是所有SQL语句都执行成功才会提交
        db.close()
       
def func_main():
        try:
                update_record()
        except Exception as e:
                print(f"更改记录失败,原因: {e}")
                db.rollback() #如果发生错误就回滚
        else:
                print("更改记录成功。")
               
if __name__ == "__main__":

        func_main()

[root@oracle ~]#


脚本运行的结果:
[root@oracle ~]# python3 xx.py
更改记录成功。
[root@oracle ~]#



######

例子十:
Oracle服务器本地删除记录的脚本:
[root@oracle ~]# cat xx.py
#coding=utf-8
import cx_Oracle

def delete_record():

        global db
        db=cx_Oracle.connect('happy/mima@127.0.0.1:1521/ORCL')
        cursor = db.cursor()
       
        Sql_1 = "delete from STU_01 WHERE NAME = '小明'"
        cursor.execute(Sql_1)

        db.commit() #把执行任务提交到数据库;必须是所有SQL语句都执行成功才会提交
        db.close()
       
def func_main():
        try:
                delete_record()
        except Exception as e:
                print(f"删除记录失败,原因: {e}")
                db.rollback() #如果发生错误就回滚
        else:
                print("删除记录成功。")
               
if __name__ == "__main__":

        func_main()

[root@oracle ~]#


脚本运行的结果:
[root@oracle ~]# python3 xx.py
删除记录成功。
[root@oracle ~]#



######

例子十一:
Oracle服务器本地输出数据库最大连接数的脚本:
[root@oracle ~]# cat xx.py
#coding=utf-8
import cx_Oracle

def query_data():
        db=cx_Oracle.connect('happy/mima@127.0.0.1:1521/ORCL')
        cursor = db.cursor()
               
        Sql_1 = "select value from v$parameter where name='processes'" #输出数据库最大连接数
        cursor.execute(Sql_1)
       
        Result_1 = cursor.fetchone()
        print(Result_1[0])
       
        db.commit() #把执行任务提交到数据库
        db.close()

def func_main():
        try:
                query_data()
        except Exception as e:
                print(f"输出失败,原因: {e}")

if __name__ == "__main__":

        func_main()

[root@oracle ~]#


脚本运行的结果:
[root@oracle ~]# python3 xx.py
150
[root@oracle ~]#





############
############

服务器本地登录Oracle:
[root@oracle ~]# su - oracle
[oracle@oracle ~]$ sqlplus /nolog

SQL*Plus: Release 11.2.0.1.0 Production on Thu Oct 29 09:55:10 2020

Copyright (c) 1982, 2009, Oracle.  All rights reserved.

SQL> conn /as sysdba;
Connected.
SQL>


查看当前数据库的最大连接数:
SQL> select value from v$parameter where name='processes';

VALUE
--------------------------------------------------------------------------------
150

SQL>


修改数据库的最大连接数:
SQL> Alter system set processes=300 scope=spfile;
Alter system set processes=300 scope=spfile
*
ERROR at line 1:
ORA-32001: write to SPFILE requested but no SPFILE is in use


SQL>


解决办法:
SQL> create spfile from pfile;

File created.

SQL>


SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL>

SQL> startup;
ORACLE instance started.

Total System Global Area  910266368 bytes
Fixed Size                  2218672 bytes
Variable Size             247465296 bytes
Database Buffers          654311424 bytes
Redo Buffers                6270976 bytes
Database mounted.
Database opened.
SQL>



修改数据库的最大连接数为300:
SQL> Alter system set processes=300 scope=spfile;

System altered.

SQL>


SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL>

SQL> startup;
ORACLE instance started.

Total System Global Area  910266368 bytes
Fixed Size                  2218672 bytes
Variable Size             247465296 bytes
Database Buffers          654311424 bytes
Redo Buffers                6270976 bytes
Database mounted.
Database opened.
SQL>



再次查看当前数据库的最大连接数:(服务器重启后,依然生效)
SQL> select value from v$parameter where name='processes';

VALUE
--------------------------------------------------------------------------------
300

SQL>





############
############

Oracle服务器卸载第三方库(cx_Oracle):
[root@oracle ~]# pip3 uninstall cx_Oracle -y
Uninstalling cx-Oracle-8.0.1:
  Successfully uninstalled cx-Oracle-8.0.1

[root@oracle ~]#


Oracle服务器卸载RPM包oracle-instantclient18.3-basic:
[root@oracle ~]# rpm -e oracle-instantclient18.3-basic
[root@oracle ~]#


笺注:假如只是在远程客户端通过Python3脚本管理Oracle数据库,那么Oracle服务器连Python3都不需要安装。













############
############

客户端CentOS7.8离线安装第三方库(cx_Oracle):
[root@ser1 ~]# ls *.whl
cx_Oracle-8.0.1-cp36-cp36m-manylinux1_x86_64.whl
[root@ser1 ~]#

[root@ser1 ~]# pip3 install cx_Oracle-8.0.1-cp36-cp36m-manylinux1_x86_64.whl
Processing ./cx_Oracle-8.0.1-cp36-cp36m-manylinux1_x86_64.whl
Installing collected packages: cx-Oracle
Successfully installed cx-Oracle-8.0.1
[root@ser1 ~]#


客户端安装相关RPM包:(CentOS7/Redhat7要安装oracle-instantclient19.9-basic):
[root@ser1 ~]# rpm -Uvh oracle-instantclient19.9-basic-19.9.0.0.0-1.x86_64.rpm
准备中...                          ################################# [100%]
正在升级/安装...
   1:oracle-instantclient19.9-basic-19################################# [100%]
[root@ser1 ~]#


[root@ser1 ~]# sudo sh -c "echo /usr/lib/oracle/19.9/client64/lib > /etc/ld.so.conf.d/oracle-instantclient.conf"
[root@ser1 ~]#
[root@ser1 ~]# cat /etc/ld.so.conf.d/oracle-instantclient.conf
/usr/lib/oracle/19.9/client64/lib
[root@ser1 ~]#
[root@ser1 ~]# sudo ldconfig
[root@ser1 ~]#



######

例子十二:
客户端远程测试与数据库连接的脚本:(/root/yy.py)
[root@ser1 ~]# cat yy.py
#coding=utf-8
import cx_Oracle

def db_connect():

        #远程连接数据库;Oracle服务器的IP地址为192.168.168.163
        db=cx_Oracle.connect('happy/mima@192.168.168.163:1521/ORCL')
       
        cursor = db.cursor()
       
        Sql_1 = "SELECT version FROM product_component_version WHERE substr(product, 1, 6) = 'Oracle'" #查看数据库版本信息
        cursor.execute(Sql_1)
       
        Result_1 = cursor.fetchone()
        print(Result_1)
        print(type(Result_1))
       
        print("-" * 10)
        print(Result_1[0]) #输出元组的第一个元素
       
        print("-" * 10)
        print(f"数据库的版本信息:{Result_1[0]}")
       
        db.close() #关闭数据库连接

def func_main():
        try:
                db_connect()
        except Exception as e:
                print(f"数据库连接失败,原因: {e}")

if __name__ == "__main__":

        func_main()


脚本运行的结果:(连接成功时)
[root@ser1 ~]# python3 yy.py
('11.2.0.1.0',)
<class 'tuple'>
----------
11.2.0.1.0
----------
数据库的版本信息:11.2.0.1.0
[root@ser1 ~]#



######

例子十三:
客户端远程输出数据库最大连接数的脚本:
[root@ser1 ~]# cat yy.py
#coding=utf-8
import cx_Oracle

def query_data():
        db = cx_Oracle.connect('happy/mima@192.168.168.163:1521/ORCL')
        cursor = db.cursor()
               
        Sql_1 = "select value from v$parameter where name='processes'"
        cursor.execute(Sql_1)
       
        Result_1 = cursor.fetchone()
        print(Result_1[0])
       
        db.commit() #把执行任务提交到数据库
        db.close()

def func_main():
        try:
                query_data()
        except Exception as e:
                print(f"输出失败,原因: {e}")

if __name__ == "__main__":

        func_main()


脚本运行的结果:
[root@ser1 ~]# python3 yy.py
300
[root@ser1 ~]#



######

例子十四:
客户端远程输出数据库中某个表的所有记录的脚本:
[root@ser1 ~]# cat yy.py
#coding=utf-8
import cx_Oracle

def query_data():
        db = cx_Oracle.connect('happy/mima@192.168.168.163:1521/orcl')
        cursor = db.cursor()
               
        Sql_1 = "select * from STU_01" #输出表STU_01中的所有记录
        cursor.execute(Sql_1)
       
        Result_1 = cursor.fetchall()
       
        for Key_1 in Result_1: #自定义输出格式
                ID = Key_1[0]
                NAME = Key_1[1]
                AGE = Key_1[2]
               
                GRADE = Key_1[3].strip() #去除左边和右边的空格、换行符

                ADDRESS = Key_1[4]
                MATH = Key_1[5]
                CHINESE = Key_1[6]
               
                SHIJIAN = str(Key_1[7])

                print(f"id={ID} && 姓名={NAME} && 年龄={AGE} && 班级={GRADE} && 地址={ADDRESS} && 数学成绩={MATH} && 语文成绩={CHINESE} && 时间={SHIJIAN}")
                       
        db.commit() #把执行任务提交到数据库
        db.close()

def func_main():
        try:
                query_data()
        except Exception as e:
                print(f"输出失败,原因: {e}")

if __name__ == "__main__":

        func_main()


脚本运行的结果:
[root@ser1 ~]# python3 yy.py
id=2 && 姓名=李大杰 && 年龄=16 && 班级=三年二班 && 地址=广东省,江门市 && 数学成绩=66.0 && 语文成绩=78.0 && 时间=2020-10-07 21:24:05
id=3 && 姓名=Zhuohua && 年龄=18 && 班级=三年十二班 && 地址=四川省,成都市 && 数学成绩=88.0 && 语文成绩=99.0 && 时间=2020-10-29 11:27:15
[root@ser1 ~]#





相关文章:
Oracle的SQL语句

Win7使用Python3脚本远程管理Oracle11gR2
CentOS8使用Python3脚本远程管理Oracle11gR2

CentOS8_在Docker中安装Oracle11gR2
CentOS8_在Docker中安装Oracle19c

Zabbix调用Python3脚本监控Linux下的Oracle(一)

CentOS6安装Python3
CentOS7安装Python3

Python3脚本管理Linux下的MySQL

返回列表