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

Python模拟Oracle的SQL/PLUS工具的实现方法是本文我们主要要介绍的内容。我们知道,团队计划开发数据库服务平台,需要用到一些服务器的脚本开发,为了了解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.  
  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常用命令操作技巧

 

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/233379.html<

(0)
运维的头像运维
上一篇2025-04-20 14:42
下一篇 2025-04-20 14:44

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注