中国领先的IT技术网站
|
|

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

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

作者:yzsind来源:CSDN博客|2011-08-17 09:48

【沙龙】51CTO诚邀您9月23号和多位技术大咖一起聊智能CDN的优化之路,抓紧时间哦!


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/

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

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

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

【编辑推荐】

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



【责任编辑:赵鹏 TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

循序渐进Oracle——数据库管理、优化与备份恢复

本书从基础知识入手,详细讨论了Oracle数据库的创建、OEM及iSQL*Plus等工具的使用、Oracle的字符集知识、用户的创建与管理、表空间和数据文...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊
× 学习达标赢Beats耳机