Welcome 微信登录

首页 / 数据库 / MySQL / Python模拟实现Oracle的sqlplus工具

团队计划开发数据库服务平台,需要用到一些服务器的脚本开发,为了了解python,给自己定了一个模拟sqlplus的小需求,然后去实现。个人体会:python开发快捷,集成很多常用的公共包,对常用数据结构使用很方便,最大的缺点是版本较多,新版本不向前兼容,对AIX及HP-UNIX不太常用的OS也缺少直接支持。
以下是工具演示:

以下是源代码:以下代码用的python版本是python2.7 http://www.python.org/
需要安装cx_Oracle开发包(python访问ORACLE用的) http://cx-oracle.sourceforge.net/
  1. import cx_Oracle  
  2. import os  
  3. import sys  
  4. os.environ["NLS_LANG"] ="AMERICAN_AMERICA.ZHS16GBK";  
  5.   
  6. connectresult=0;  
  7. promptstr="";  
  8. fetchsize=50;  
  9. #conn = cx_Oracle.connect("yzs/yzs@mydb");   
  10. print"------------Welcome To Python Sqlplus ----------------------");  
  11. print"|  Version     : 0.1");  
  12. print"|  Author      : MKing");  
  13. print"|  Blog        : http://blog.csdn.net/yzsind");  
  14. print"|  Sina weibo  : http://weibo.com/yzsind");  
  15. print"|  Release Date: 2011-08-08");  
  16. print"|  Login Example1:username/password@tnsname");  
  17. print"|  Login Example2:username/password@host:port/dbname");  
  18. print"|  Input exit to Quit");  
  19. print"-----------------------------------------------------------");  
  20. print("");  
  21.   
  22. def getConnect(loginstr):  
  23.   global connectresult  
  24.   global promptstr  
  25.   try:  
  26.     connectresult=0;  
  27.     promptstr="";  
  28.     conn= cx_Oracle.connect(loginstr);  
  29.     promptstr=conn.username+"@"+conn.dsn;  
  30.     print"Database version:",conn.version);  
  31.     print"Connected.");  
  32.     connectresult=1;  
  33.     return conn  
  34.   except cx_Oracle.InterfaceError as exc:  
  35.     error, = exc.args  
  36.     print(exc);  
  37.   except cx_Oracle.DatabaseError as exc:  
  38.     error, = exc.args  
  39.     print(error.message);  
  40.   
  41. def getcolformatstr(coldef):  
  42.   if coldef[1]==cx_Oracle.NUMBER:  
  43.     formatstr="%12s";  
  44.   else:  
  45.     if coldef[2]<=32:  
  46.       formatstr="%-"+str(coldef[2])+"s";  
  47.     else:  
  48.       formatstr="%-32s";  
  49.   return formatstr  
  50.     
  51. #########################################################################   
  52. while 1:  
  53.   try:  
  54.     loginstr=raw_input("login>").strip();  
  55.     if loginstr=="" :  
  56.       continue;  
  57.     elif loginstr in ["exit","exit;"]:  
  58.       print"...bye...");  
  59.       exit();      
  60.     conn = getConnect(loginstr);  
  61.     if connectresult==1:  
  62.       break;  
  63.   except KeyboardInterrupt:  
  64.     print"^C");  
  65.     continue;    
  66. while 1:  
  67.   sqlstr="";  
  68.   try:  
  69.     sqlstrline=raw_input(promptstr+">").strip();  
  70.     if sqlstrline=="" :  
  71.       continue;  
  72.     elif sqlstrline.lower() in ["exit","exit;"]:  
  73.       print"...bye...");  
  74.       exit();  
  75.     elif sqlstrline[0:7].lower()=="connect" :  
  76.       conn = getConnect(sqlstrline[8:]);  
  77.     elif sqlstrline.lower() in ["disconnect","disconnect;"] :  
  78.       conn.close();  
  79.       print"Connection closed.");  
  80.     elif sqlstrline[0:4].lower()=="host" :  
  81.       os.system(sqlstrline[4:])  
  82.     else:  
  83.       sqlstr=sqlstr+sqlstrline+" ";  
  84.       while sqlstrline[-1]!=";" :  
  85.         sqlstrline=raw_input().strip();  
  86.         sqlstr=sqlstr+sqlstrline+" ";  
  87.       sqlstr=sqlstr[0:len(sqlstr)-2]  
  88.       try:  
  89.         cursor = conn.cursor();  
  90.         cursor.execute(sqlstr);  
  91.         if sqlstr[0:6].lower()=="select" :  
  92.           cols=[]  
  93.           for col in cursor.description:  
  94.             print(getcolformatstr(col) % (col[0])),  
  95.           print"");  
  96.           for col in cursor.description:  
  97.             if col[1]==cx_Oracle.NUMBER:  
  98.               print"-"*12),;  
  99.             else:  
  100.               if col[2]<=32:  
  101.                 print"-"*col[2]),;  
  102.               else:  
  103.                 print"-"*32),;  
  104.           print"");  
  105.           recs = cursor.fetchmany(fetchsize);  
  106.           while len(recs)>0:  
  107.             for row in recs:  
  108.               for i in range(len(row)):  
  109.                 if row[i]!=None:  
  110.                   print(getcolformatstr(cursor.description[i]) % row[i]),;  
  111.                 else:  
  112.                   print(getcolformatstr(cursor.description[i]) % ""),;    
  113.               print"")  
  114.             recs = cursor.fetchmany(fetchsize);  
  115.           print(str(cursor.rowcount)+" rows selected.");  
  116.         elif sqlstr[0:6].lower()=="insert" :  
  117.           print(str(cursor.rowcount)+" rows inserted.");  
  118.         elif sqlstr[0:6].lower()=="update" :  
  119.           print(str(cursor.rowcount)+" rows updated.");  
  120.         elif sqlstr[0:6].lower()=="delete" :  
  121.           print(str(cursor.rowcount)+" rows deleted.");  
  122.         elif sqlstr[0:5].lower()=="merge" :  
  123.           print(str(cursor.rowcount)+" rows merged.");  
  124.         elif sqlstr[0:6].lower()=="commit" :  
  125.           print"Commit complete.");  
  126.         elif sqlstr[0:6].lower()=="rollback" :  
  127.           print"Rollback complete.");  
  128.         else :  
  129.           print"sql execute complete.");  
  130.       except cx_Oracle.InterfaceError as exc:  
  131.         error, = exc.args  
  132.         print(exc);  
  133.       except cx_Oracle.DatabaseError as exc:  
  134.         error, = exc.args  
  135.         print(error.message);  
  136.   except KeyboardInterrupt:  
  137.     print"^C");  
  138.     continue;    
  139.     
  140.     
  141.     
特别说明:纯属个人学习python的代码,未考虑扩展性与性能,未经过专业测试,不建议拿到实际工作中当SQLPLUS用。如何让Oracle索引不起作用(不可见)Linux下卸载Oracle数据库相关资讯      Oracle教程 
  • Oracle中纯数字的varchar2类型和  (07/29/2015 07:20:43)
  • Oracle教程:Oracle中查看DBLink密  (07/29/2015 07:16:55)
  • [Oracle] SQL*Loader 详细使用教程  (08/11/2013 21:30:36)
  • Oracle教程:Oracle中kill死锁进程  (07/29/2015 07:18:28)
  • Oracle教程:ORA-25153 临时表空间  (07/29/2015 07:13:37)
  • Oracle教程之管理安全和资源  (04/08/2013 11:39:32)
本文评论 查看全部评论 (0)
表情: 姓名: 字数