python执行oracle的sql语句_5.通过进程号获取SQL语句

通过进程号获取SQL语句

我们在日常Oracle维护中,可能有的进程占用的CPU或者内存较高,这时我们需要知道它对应的SQL语句,下面这个功能可实现这个功能

注意:进程必须处于run状态才能查到,多个进程同时查询请用空格隔开

开发环境

操作系统:CentOS 7.3

Python版本 :2.7

Django版本: 1.10.5

操作系统用户:oracle

建立页面的步骤

我们还是通过这张图的步骤来说明如何建立页面

urls.py页面

首先是monitor/urls.py,这节不需要修改这个文件

urlpatterns = [

url(r'^$', views.index, name='index'),

url(r'^oracle_command/$',views.oracle_command, name='oracle_command'),

url(r'^commandresult/$',views.commandresult, name='commandresult'),

]

oracle_command为执行Oracle命令的页面

commandresult为执行完Oracle命令显示结果的页面

views.py

下面为commandresult对应的函数在views.py里面的写法

elif command_content=='check_process_text':

pid1=[]

try:

db = cx_Oracle.connect(username+'/'+password+'@'+ipaddress+':'+port+'/'+tnsname ,mode=cx_Oracle.SYSDBA)

except Exception , e:

content= (ipaddress+' is Unreachable,The reason is '+ str(e)).strip()

return HttpResponse(content)

else:

pid = str(request.GET['sql'])

pid=pid.split()

for i in pid:

pid1.append('\''+str(i).strip().upper()+'\'')

pid=','.join(pid1)

cursor = db.cursor()

row=getprocesstext(cursor,pid)

cursor.close()

db.close()

title='数据库进程对用的SQL语句-'+ipaddress+'-'+tnsname

tr=['SPID','SID','HASH_VALUE','SQL_TEXT','LOGON_TIME','PROGRAM']

dic ={'title':title,'tr':tr,'row':row}

return render_to_response('oracle_command_result_6.html',dic)

首先获取到表单中的数据,如 ipaddress,tnsname以及执行的命令

然后通过ipaddress,tnsname从oraclelist数据库中查找获得用户名密码用于连接

再判断命令内容,如果是check_process_text则首先获取进程号码(pid)并连接起来

在执行函数getprocesstext获取相关SQL信息,这里之所以用hash_value是因为我有9i的库

这里的getprocesstext函数获取Oracle 信息,包括SID,HASH_VALUE,LOGON_TIME,PROGRAM,详情看具体代码

最后把页面的标题以及表格的数据放到dic变量中传到

oracle_command_result_6.html模板文件中

getprocesstext函数

这里的getprocesstext函数获取Oracle 信息,包括SID,HASH_VALUE,LOGON_TIME,PROGRAM,详情看具体代码

monitor/command/getoraclecommandresult.py

def getprocesstext(cursor,pid):

fp1='select a.spid,b.sid,c.hash_value,substr(c.sql_text, 0, 40),b.logon_time,b.program from v$process a, v$session b, V$SQL c where a.addr = b.paddr and b.sql_hash_value = c.hash_value and a.spid in ('+pid+')'

s=cursor.execute(fp1)

row=s.fetchall()

return row

template文件

这里我们使用oracle_command_result_6.html文件来显示

oracle_command_result_6.html

{{title}}

{% for i in tr %}

{{i}}

{%endfor%}

{% for a,b,c,d,e,f in row %}

{{a}}{{b}}{{c}}{{d}}{{e}}{{f}}

{% endfor %}

该模板是一个table ,通过将传过来的变量显示在前端页面

实际效果

多个表一起查询请使用空格隔开

源码地址

源码请查看我的GitHub主页

下期将介绍如何如何通过会话查看进程号

在使用cx_Oracle模块执行SQL语句时,可以使用Cursor对象的execute方法。在调用execute方法之前,可以使用Cursor对象的prepare方法进行预编译,这样在执行execute时就不需要再写SQL语句参数了。 要使用cx_Oracle执行SQL语句,首先需要连接到Oracle数据库。可以使用cx_Oracle.connect函数提供的参数来建立与数据库的连接。连接成功后,可以创建一个Cursor对象来执行SQL语句。可以使用Cursor对象的execute方法来执行SQL语句,传入SQL语句作为参数。 例如,要执行一条查询语句,可以使用Cursor对象的execute方法传入SQL语句作为参数,然后使用Cursor对象的fetchall方法获取查询结果。例如: ```python import cx_Oracle # 建立与Oracle数据库的连接 connection = cx_Oracle.connect("username/password@localhost:1521/xe") # 创建一个Cursor对象 cursor = connection.cursor() # 执行SQL查询语句 cursor.execute("SELECT * FROM table_name") # 获取查询结果 results = cursor.fetchall() # 输出查询结果 for row in results: print(row) # 关闭Cursor对象和数据库连接 cursor.close() connection.close() ``` 以上代码演示了使用cx_Oracle模块执行SQL查询语句的基本步骤。可以根据实际需求进行修改和扩展。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [cx_Oracle使用方法](https://blog.csdn.net/weixin_42769040/article/details/81629054)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [Python使用cx_Oracle模块操作Oracle数据库详解](https://download.csdn.net/download/weixin_38623009/12825512)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值