根据博友的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查询优化改写技巧与案例》不讲具体语法,只是以案例的形式介绍各种查询语句的用法。第1~4章是基础部分,讲述了常用的各种基础语句,以及常见的错误和正确语句的写法。这部分的内容应熟练掌握,因为日常查询...
《Oracle查询优化改写技巧与案例》不讲具体语法,只是以案例的形式介绍各种查询语句的用法。第1~4章是基础部分,讲述了常用的各种基础语句,以及常见的错误和正确语句的写法。这部分的内容应熟练掌握,因为日常查询...
Oracle查询优化改写技巧与案例2.0.pdf
教主Oracle SQL高级查询优化改写完美培训视频 2.0版,这个我参与培训的,包含视频、SQL文件、教学文档内容完整,分享给大家学习,共同努力进阶转型开发DBA,人称教主,做sql改写十多年了,sql改写功底很强!
《Oracle查询优化改写技巧与案例》不讲具体语法,只是以案例的形式介绍各种查询语句的用法。第1~4章是基础部分,讲述了常用的各种基础语句,以及常见的错误和正确语句的写法。这部分的内容应熟练掌握,因为日常查询...
Oracle查询优化改写 技巧与案例.pdf
《Oracle查询优化改写技巧与案例》不讲具体语法,只是以案例的形式介绍各种查询语句的用法。第1~4章是基础部分,讲述了常用的各种基础语句,以及常见的错误和正确语句的写法。这部分的内容应熟练掌握,因为日常查询...
《Oracle查询优化改写技巧与案例》PDF版本下载
改写了proxool,让他支持spring注入 当用spring注入时间的时候,跑起来spring会报错。 是因为里面类似不一致的问题。改写之后,跑起来不会有问题
Oracle查询优化改写技巧与案例2.0 畅销书升级,实用,没废话,字典式写作,覆盖大多数DBA日常工作场景,分享大量SQL优化的实际工作经验,也可作为开发人员编写SQL的速查字典
CC2511F32 Customer HID 改写程序
Oracle查询优化改写,大量实际案例
SQL改写优化案例分析.pptx
【oracle】oracle查询优化改写,oracle学习的必修课程。
struts2实现改写在url后缀的方法,如XX.do--->改写为xx.html等,方便试用,一目了然
Oracle查询优化改写技巧与案例.pdf
您是否不满足于只是对Mp3文件名的改写, 对于专辑的名字,歌手,时间也想改变呢? 这个小程序就可以办到。。。