`
leitelyaya
  • 浏览: 68889 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

改写PySQLPLUS

阅读更多
根据博友的PySQLPLUS脚本改写,增加Readline模块,解决SQLPLUS命令行内难以编辑和回退的问题。

PySQLPLUS源:http://blog.csdn.net/yzsind/article/details/6693160

#!/bin/env python2.7
# encode : utf-8

import cx_Oracle
import os
import sys
import readline
os.environ['NLS_LANG'] = ".AL32UTF8";

histfile = os.path.join(os.path.expanduser("~"), ".pyhist")
try:
    readline.read_history_file(histfile)
except IOError:
    pass
import atexit
atexit.register(readline.write_history_file, histfile)

fetchsize = 50;
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):
    try:
        conn = cx_Oracle.connect(loginstr);
        print("Database version:", conn.version);
        print("Connected.");
        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);
    return None;

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

def main(loginstr):
    for i in range(3):
        try:
            if (loginstr == None or len(loginstr) == 0):
                loginstr = raw_input("login>").strip();
                continue;
            conn = getConnect(loginstr);
            if conn == None:
                print("Connection failure!");
                loginstr = None;
                continue;
            else:
                break;
        except KeyboardInterrupt:
            print("^C");
            continue;  
        except EOFError:
            print("Bye");
            return;
    
    promptstr = conn.dsn;
    executor(conn, promptstr);

def executor(conn, promptstr):
    while True:
        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:
                sqlstr = sqlstr + sqlstrline + '\n';
                while sqlstrline[-1] != ";" :
                    sqlstrline = raw_input().strip();
                    sqlstr = sqlstr + sqlstrline + '\n';
                sqlstr = 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;  
        except EOFError:
            print("Bye");
            return;


#########################################################################
if __name__ == '__main__':
    args = sys.argv[1:];
    loginstr = None;
    if (len(args) > 0):
        loginstr = args[0];
    main(loginstr);

分享到:
评论

相关推荐

    Oracle查询优化改写技巧与案例2.zip

    《Oracle查询优化改写技巧与案例》不讲具体语法,只是以案例的形式介绍各种查询语句的用法。第1~4章是基础部分,讲述了常用的各种基础语句,以及常见的错误和正确语句的写法。这部分的内容应熟练掌握,因为日常查询...

    Oracle查询优化改写技巧与案例

    《Oracle查询优化改写技巧与案例》不讲具体语法,只是以案例的形式介绍各种查询语句的用法。第1~4章是基础部分,讲述了常用的各种基础语句,以及常见的错误和正确语句的写法。这部分的内容应熟练掌握,因为日常查询...

    jiaozhu.zip 教主 Oracle SQL改写优化 2.0版

    教主Oracle SQL高级查询优化改写完美培训视频 2.0版,这个我参与培训的,包含视频、SQL文件、教学文档内容完整,分享给大家学习,共同努力进阶转型开发DBA,人称教主,做sql改写十多年了,sql改写功底很强!

    Oracle查询优化改写 技巧与案例_高清带书签版本

    《Oracle查询优化改写技巧与案例》不讲具体语法,只是以案例的形式介绍各种查询语句的用法。第1~4章是基础部分,讲述了常用的各种基础语句,以及常见的错误和正确语句的写法。这部分的内容应熟练掌握,因为日常查询...

    Oracle查询优化改写 技巧与案例.pdf

    Oracle查询优化改写 技巧与案例.pdf

    四年级数学上册数的改写.ppt

    《四年级数学上册数的改写》是针对四年级学生设计的一节数学课程,主要讲解如何将大数改写成以“万”或“亿”为单位的小数。这节课的内容涵盖了数字改写的基本原则和步骤,以及实际应用中的问题解决。 改写大数的...

    oracle查询优化改写技巧与案例

    《Oracle查询优化改写技巧与案例》不讲具体语法,只是以案例的形式介绍各种查询语句的用法。第1~4章是基础部分,讲述了常用的各种基础语句,以及常见的错误和正确语句的写法。这部分的内容应熟练掌握,因为日常查询...

    负载均衡服务器负载HTTP头部改写.pdf

    而应答改写则发生在AD设备收到服务器响应之后,但在发送给客户端之前,客户端能够明显看到结果。 总之,HTTP头部改写是负载均衡服务器中的一个重要功能,它能够帮助解决IP识别、动态内容分发以及安全防护等问题。...

    《Oracle查询优化改写技巧与案例》PDF版本下载.txt

    根据提供的文件信息,本文将对《Oracle查询优化改写技巧与案例》这一主题进行详细的解析,涵盖Oracle查询优化的基本概念、重要性、改写技巧及其实际应用案例。 ### 一、Oracle查询优化概述 #### 1.1 查询优化定义 ...

    四年级人教数学整万数和非整万数的改写PPT学习教案.pptx

    这篇PPT的学习教案主要针对四年级学生,涵盖了人教版数学教材中关于整万数和非整万数改写的教学内容。整万数是指个级全部由0组成的数,例如1000000,而改写成用“万”作单位的数,就是将个级的4个0去掉,写成相应的...

    oracle 查询优化改写

    "Oracle查询优化改写"是一个专业领域,旨在通过调整SQL语句的结构和逻辑,提高查询速度,降低资源消耗,从而提升整体系统性能。本文将深入探讨这个主题,结合大量实际案例,提供一系列实用的技巧和方法。 首先,...

    CC2511F32 Customer HID 改写程序

    【CC2511F32 Customer HID 改写程序详解】 CC2511F32是一款由Texas Instruments(TI)公司推出的超低功耗微控制器,它在无线射频(RF)应用中非常常见,特别是在蓝牙低功耗(BLE)和无线传感器网络等领域。在本项目...

    live555 的openRTSP 改写

    【标题】"live555 的openRTSP 改写" 在实时流媒体领域,live555是一个广泛使用的开源库,它提供了多种协议(如RTSP、RTCP、RTP)的支持,使得开发者能够创建复杂的多媒体应用。openRTSP是live555库中的一个命令行...

    Oracle查询优化改写-技巧与案例

    本书“Oracle查询优化改写-技巧与案例2.0”聚焦于这一主题,旨在为数据库管理员(DBA)和开发人员提供实用的指导。 1. **查询优化基础**:优化SQL查询始于理解Oracle的执行计划。书中可能涵盖了如何使用`EXPLAIN PLAN...

    三年级(下)改写句子练习.pdf

    【改写句子练习】 在语文学习中,改写句子是一项重要的技能,旨在培养学生的语言表达能力和思维灵活性。以下是对题目中给出的句子进行改写的详细分析: 1. 照样子写句子: - 原句:冬天荚树落光了叶子。 改写:...

    改写proxool(spring)

    改写了proxool,让他支持spring注入 当用spring注入时间的时候,跑起来spring会报错。 是因为里面类似不一致的问题。改写之后,跑起来不会有问题

Global site tag (gtag.js) - Google Analytics