Python模拟Oracle的SQL/PLUS工具的实现方法

数据库 Oracle
本文我们主要介绍了用Python模拟Oracle的SQL/PLUS工具的实现方法,并给出了详细的源代码,希望能够对您有所帮助。

Python模拟Oracle的SQL/PLUS工具的实现方法是本文我们主要要介绍的内容。我们知道,团队计划开发数据库服务平台,需要用到一些服务器的脚本开发,为了了解python,给自己定了一个模拟sqlplus的小需求,然后去实现。

个人体会:

python开发快捷,集成很多常用的公共包,对常用数据结构使用很方便,***的缺点是版本较多,新版本不向前兼容,对AIX及HP-UNIX不太常用的OS也缺少直接支持。

以下是工具演示:

Python模拟Oracle的SQL/PLUS工具的实现方法
  

以下是源代码:

以下代码用的python版本是python2.7 http://www.python.org/
需要安装cx_Oracle开发包(python访问ORACLE用的) http://cx-oracle.sourceforge.net/

import cx_Oracle    
 
import os    
 
import sys    
 
os.environ['NLS_LANG'] ='AMERICAN_AMERICA.ZHS16GBK';    
 
connectresult=0;    
 
promptstr="";    
 
fetchsize=50;    
 
#conn = cx_Oracle.connect('yzs/yzs@mydb');     
 
print("------------Welcome To Python Sqlplus ----------------------");    
 
print("|  Version     : 0.1");    
 
print("|  Author      : MKing");    
 
print("|  Blog        : http://blog.csdn.net/yzsind");    
 
print("|  Sina weibo  : http://weibo.com/yzsind");    
 
print("|  Release Date: 2011-08-08");    
 
print("|  Login Example1:username/password@tnsname");    
 
print("|  Login Example2:username/password@host:port/dbname");    
 
print("|  Input exit to Quit");    
 
print("-----------------------------------------------------------");    
 
print("");    
 
    
 
def getConnect(loginstr):    
 
  global connectresult    
 
  global promptstr    
 
  try:    
 
    connectresult=0;    
 
    promptstr="";    
 
    conncx_Oracle.connect(loginstr);    
 
    promptstr=conn.username+"@"+conn.dsn;    
 
    print("Database version:",conn.version);    
 
    print("Connected.");    
 
    connectresult=1;    
 
    return conn    
 
  except cx_Oracle.InterfaceError as exc:    
 
    error, = exc.args    
 
    print(exc);    
 
  except cx_Oracle.DatabaseError as exc:    
 
    error, = exc.args    
 
    print(error.message);    
 
def getcolformatstr(coldef):    
 
  if coldef[1]==cx_Oracle.NUMBER:    
 
    formatstr='%12s';    
 
  else:    
 
    if coldef[2]<=32:    
 
      formatstr='%-'+str(coldef[2])+'s';    
 
    else:    
 
      formatstr='%-32s';    
 
  return formatstr    
 
      
 
#########################################################################     
 
while 1:    
 
  try:    
 
    loginstr=raw_input("login>").strip();    
 
    if loginstr=="" :    
 
      continue;    
 
    elif loginstr in ["exit","exit;"]:    
 
      print("...bye...");    
 
      exit();        
 
    conn = getConnect(loginstr);    
 
    if connectresult==1:    
 
      break;    
 
  except KeyboardInterrupt:    
 
    print("^C");    
 
    continue;      
 
while 1:    
 
  sqlstr="";    
 
  try:    
 
    sqlstrline=raw_input(promptstr+">").strip();    
 
    if sqlstrline=="" :    
 
      continue;    
 
    elif sqlstrline.lower() in ["exit","exit;"]:    
 
      print("...bye...");    
 
      exit();    
 
    elif sqlstrline[0:7].lower()=="connect" :    
 
      conn = getConnect(sqlstrline[8:]);    
 
    elif sqlstrline.lower() in ["disconnect","disconnect;"] :    
 
      conn.close();    
 
      print("Connection closed.");    
 
    elif sqlstrline[0:4].lower()=="host" :    
 
      os.system(sqlstrline[4:])    
 
    else:    
 
      sqlstrsqlstr=sqlstr+sqlstrline+'\n';    
 
      while sqlstrline[-1]!=";" :    
 
        sqlstrline=raw_input().strip();    
 
        sqlstrsqlstr=sqlstr+sqlstrline+'\n';    
 
      sqlstrsqlstr=sqlstr[0:len(sqlstr)-2]    
 
      try:    
 
        cursor = conn.cursor();    
 
        cursor.execute(sqlstr);    
 
        if sqlstr[0:6].lower()=="select" :    
 
          cols=[]    
 
          for col in cursor.description:    
 
            print(getcolformatstr(col) % (col[0])),    
 
          print('');    
 
          for col in cursor.description:    
 
            if col[1]==cx_Oracle.NUMBER:    
 
              print('-'*12),;    
 
            else:    
 
              if col[2]<=32:    
 
                print('-'*col[2]),;    
 
              else:    
 
                print('-'*32),;    
 
          print('');    
 
          recs = cursor.fetchmany(fetchsize);    
 
          while len(recs)>0:    
 
            for row in recs:    
 
              for i in range(len(row)):    
 
                if row[i]!=None:    
 
                  print(getcolformatstr(cursor.description[i]) % row[i]),;    
 
                else:    
 
                  print(getcolformatstr(cursor.description[i]) % ''),;      
 
              print('')    
 
            recs = cursor.fetchmany(fetchsize);    
 
          print(str(cursor.rowcount)+" rows selected.");    
 
        elif sqlstr[0:6].lower()=="insert" :    
 
          print(str(cursor.rowcount)+" rows inserted.");    
 
        elif sqlstr[0:6].lower()=="update" :    
 
          print(str(cursor.rowcount)+" rows updated.");    
 
        elif sqlstr[0:6].lower()=="delete" :    
 
          print(str(cursor.rowcount)+" rows deleted.");    
 
        elif sqlstr[0:5].lower()=="merge" :    
 
          print(str(cursor.rowcount)+" rows merged.");    
 
        elif sqlstr[0:6].lower()=="commit" :    
 
          print("Commit complete.");    
 
        elif sqlstr[0:6].lower()=="rollback" :    
 
          print("Rollback complete.");    
 
        else :    
 
          print("sql execute complete.");    
 
      except cx_Oracle.InterfaceError as exc:    
 
        error, = exc.args    
 
        print(exc);    
 
      except cx_Oracle.DatabaseError as exc:    
 
        error, = exc.args    
 
        print(error.message);    
 
  except KeyboardInterrupt:    
 
    print("^C");    
 
    continue;   
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.
  • 108.
  • 109.
  • 110.
  • 111.
  • 112.
  • 113.
  • 114.
  • 115.
  • 116.
  • 117.
  • 118.
  • 119.
  • 120.
  • 121.
  • 122.
  • 123.
  • 124.
  • 125.
  • 126.
  • 127.
  • 128.
  • 129.
  • 130.
  • 131.
  • 132.
  • 133.
  • 134.
  • 135.
  • 136.
  • 137.
  • 138.
  • 139.
  • 140.
  • 141.
  • 142.
  • 143.
  • 144.
  • 145.
  • 146.
  • 147.
  • 148.
  • 149.
  • 150.
  • 151.
  • 152.
  • 153.
  • 154.
  • 155.
  • 156.
  • 157.
  • 158.
  • 159.
  • 160.
  • 161.
  • 162.
  • 163.
  • 164.
  • 165.
  • 166.
  • 167.
  • 168.
  • 169.
  • 170.
  • 171.
  • 172.
  • 173.
  • 174.
  • 175.
  • 176.
  • 177.
  • 178.
  • 179.
  • 180.
  • 181.
  • 182.
  • 183.
  • 184.
  • 185.
  • 186.
  • 187.
  • 188.
  • 189.
  • 190.
  • 191.
  • 192.
  • 193.
  • 194.
  • 195.
  • 196.
  • 197.
  • 198.
  • 199.
  • 200.
  • 201.
  • 202.
  • 203.
  • 204.
  • 205.
  • 206.
  • 207.
  • 208.
  • 209.
  • 210.
  • 211.
  • 212.
  • 213.
  • 214.
  • 215.
  • 216.
  • 217.
  • 218.
  • 219.
  • 220.
  • 221.
  • 222.
  • 223.
  • 224.
  • 225.
  • 226.
  • 227.
  • 228.
  • 229.
  • 230.
  • 231.
  • 232.
  • 233.
  • 234.
  • 235.
  • 236.
  • 237.
  • 238.
  • 239.
  • 240.
  • 241.
  • 242.
  • 243.
  • 244.
  • 245.
  • 246.
  • 247.
  • 248.
  • 249.
  • 250.
  • 251.
  • 252.
  • 253.
  • 254.
  • 255.
  • 256.
  • 257.
  • 258.
  • 259.
  • 260.
  • 261.
  • 262.
  • 263.
  • 264.
  • 265.
  • 266.
  • 267.
  • 268.
  • 269.
  • 270.
  • 271.

特别说明:纯属个人学习python的代码,未考虑扩展性与性能,未经过专业测试,不建议拿到实际工作中当SQLPLUS用。

关于Python模拟Oracle的SQL/PLUS工具的实现方法就介绍到这里了,希望本次的介绍能够对您有所收获!

【编辑推荐】

  1. 适合初学者的MySQL学习笔记之管理员常用操作总结
  2. 适合初学者的MySQL学习笔记之SELECT语句使用详解
  3. MySQL数据库存储引擎之MyISAM和InnoDB的区别对比
  4. 适合初学者的MySQL学习笔记之ORDER BY子句使用详解
  5. 适合初学者的MySQL学习笔记之MySQL常用命令操作技巧



 

责任编辑:赵鹏 来源: CSDN博客
相关推荐

2010-03-30 18:31:17

Oracle Copy

2010-11-18 17:08:44

Oracle使用SQL

2010-10-29 13:34:09

Oracle日志

2010-05-04 17:49:39

Oracle安装

2010-11-19 13:42:38

2009-11-05 17:53:59

Oracle导出SQL

2010-05-10 16:17:19

Oracle LogM

2010-10-29 14:20:54

Oracle移动控制文

2010-11-19 13:14:21

Oracle删除归档日

2010-03-31 15:03:54

Oracle执行

2009-08-07 09:35:40

Oracle发送Ema

2011-07-27 09:57:24

SQL TraceOracle

2023-09-14 08:20:46

JDBC数据库

2010-10-26 11:04:48

oracle数据导入

2009-03-26 10:46:58

OraclePL、SQL存储过程

2010-10-25 15:56:02

Oracle PLSQL过程调试

2010-10-29 16:12:51

Oracle存储过程

2010-11-15 14:07:16

Oracle取固定记录

2010-11-12 10:38:24

SQL Server自

2010-10-28 16:17:22

点赞
收藏

51CTO技术栈公众号