Python如何执行存储过程,获取存储过程返回值

<p>在Pathon中如何执行存储过程呢?可以使用如下方法:</p>
<p>存储过程定义基本如下:</p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: Courier New; color: #0000ff; font-size: x-small;"><span style="font-family: 'Courier New'; color: #0000ff; font-size: 10pt;">ALTER</span>
</span>
<span style="font-family: Courier New; font-size: x-small;"><span style="font-family: 'Courier New'; font-size: 10pt;"> <span style="color: #0000ff;"><span style="color: #0000ff;">procedure</span>
</span>
[dbo]<span style="color: #808080;"><span style="color: #808080;">.</span>
</span>
[mysp] </span>
</span>
</p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: Courier New; font-size: x-small;"><span style="font-family: 'Courier New'; font-size: 10pt;">@Station <span style="color: #0000ff;"><span style="color: #0000ff;">varchar</span>
</span>
<span style="color: #808080;"><span style="color: #808080;">(</span>
</span>
50<span style="color: #808080;"><span style="color: #808080;">),</span>
</span>
</span>
</span>
</p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: Courier New; font-size: x-small;"><span style="font-family: 'Courier New'; font-size: 10pt;">@SN <span style="color: #0000ff;"><span style="color: #0000ff;">varchar</span>
</span>
<span style="color: #808080;"><span style="color: #808080;">(</span>
</span>
50<span style="color: #808080;"><span style="color: #808080;">),</span>
</span>
<span style="color: #008000;"><span style="color: #008000;"></span>
</span>
</span>
</span>
</p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: Courier New; font-size: x-small;"><span style="font-family: 'Courier New'; font-size: 10pt;">@Info <span style="color: #0000ff;"><span style="color: #0000ff;">varchar</span>
</span>
<span style="color: #808080;"><span style="color: #808080;">(</span>
</span>
500<span style="color: #808080;"><span style="color: #808080;">)</span>
</span>
<span style="color: #0000ff;"><span style="color: #0000ff;">output</span>
</span>
<span style="color: #808080;"><span style="color: #808080;">,</span>
</span>
</span>
</span>
</p>
<p class="MsoNormal" style="text-indent: 5pt;"><span style="font-family: Courier New; font-size: x-small;"><span style="font-family: 'Courier New'; font-size: 10pt;">@Msg <span style="color: #0000ff;"><span style="color: #0000ff;">varchar</span>
</span>
<span style="color: #808080;"><span style="color: #808080;">(</span>
</span>
500<span style="color: #808080;"><span style="color: #808080;">)</span>
</span>
<span style="color: #0000ff;"><span style="color: #0000ff;">output</span>
</span>
</span>
</span>
</p>
<p></p>
<p>1. 使用adodbapi</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Python代码 <a title="收藏这段代码"><img class="star" src="http://www.iteye.com/images/icon_star.png" alt="收藏代码"></a>
</div>
</div>
<ol class="dp-py">
<li>
<span class="keyword">from</span>
adodbapi<span class="keyword">import</span>
connect</li>
<li>
<li>server=<span class="string">'dbserver'</span>
</li>
<li>user=<span class="string">'username'</span>
</li>
<li>password=<span class="string">'password'</span>
</li>
<li>database=<span class="string">'database'</span>
</li>
<li>sp=<span class="string">'sp'</span>
</li>
<li>station=<span class="string">'station'</span>
</li>
<li>sn=<span class="string">'sn'</span>
</li>
<li>
<li>
<span class="keyword">try</span>
:</li>
<li>db=connect('Provider=SQLOLEDB.<span class="number">1</span>
;DataSource=%s;InitialCatalog=%s;/</li>
<li>UserID=%s;Password=%s;'%(server,database,user,password))</li>
<li>
<span class="keyword">except</span>
Exception,e:</li>
<li>
<span class="keyword">print</span>
e</li>
<li>
<span class="keyword">else</span>
:</li>
<li>cur=db.cursor()</li>
<li>msg=cur.callproc(sp,(station,sn))<span class="comment">#参数与存储过程有关</span>
</li>
<li>
<span class="keyword">if</span>
len(msg)&gt;<span class="number">1</span>
:</li>
<li>
<span class="keyword">if</span>
msg[-<span class="number">1</span>
]<span class="keyword">is</span>
<span class="special">None</span>
:</li>
<li>
<span class="keyword">print</span>
<span class="string">'snisok.Canbetestatthisstation'</span>
</li>
<li>
<span class="keyword">else</span>
:</li>
<li>
<span class="keyword">print</span>
msg[-<span class="number">1</span>
]</li>
<li>
<span class="keyword">finally</span>
:</li>
<li>
<span class="keyword">try</span>
:db.close()</li>
<li>
<span class="keyword">except</span>
:<span class="keyword">pass</span>
</li>
</ol>
</div>
<p></p>
<p>2. 使用pymssql</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Python代码 <a title="收藏这段代码"><img class="star" src="http://www.iteye.com/images/icon_star.png" alt="收藏代码"></a>
</div>
</div>
<ol class="dp-py">
<li>
<span class="keyword">from</span>
pymssql<span class="keyword">import</span>
connect</li>
<li>
<li>server=<span class="string">'dbserver'</span>
</li>
<li>user=<span class="string">'user'</span>
</li>
<li>password=<span class="string">'password'</span>
</li>
<li>database=<span class="string">'database'</span>
</li>
<li>sp=<span class="string">'sp'</span>
</li>
<li>station=<span class="string">'station'</span>
</li>
<li>sn=<span class="string">'sn'</span>
</li>
<li>
<li>sql=[<span class="string">'setnocounton'</span>
]</li>
<li>sql.append(<span class="string">'declare@Msgvarchar(500)'</span>
)</li>
<li>sql.append(<span class="string">'declare@return_valuevarchar'</span>
)</li>
<li>sql.append(<span class="string">"exec@return_value=%s@Station='%s',@SN='%s',@Info='@Info',@Msg=@Msgoutput"</span>
)</li>
<li>sql.append(<span class="string">'select@Msg,@return_value'</span>
)</li>
<li>sql=<span class="string">'/n'</span>
.join(sql)%(sp,station,sn)</li>
<li>
<li>
<span class="keyword">def</span>
ffchk(server,user,password,database,sql):</li>
<li>
<span class="keyword">try</span>
:</li>
<li>db=connect(host=server,</li>
<li>database=database,</li>
<li>user=user,</li>
<li>password=password,</li>
<li>login_timeout=<span class="number">10</span>
)</li>
<li>cur=db.cursor()</li>
<li>cur.execute(sql)</li>
<li>
<span class="keyword">except</span>
Exception,e:</li>
<li>
<span class="keyword">print</span>
e</li>
<li>
<span class="keyword">else</span>
:</li>
<li>cur.nextset()<span class="comment">#要加上这句才能通过fetch函数取到值</span>
  <span style="color: #ff0000;"> 注意:这语句在Python2.7对应的pymssql版本中是错误!!!</span>

</li>
<li>
<span class="keyword">print</span>
cur.fetchone()</li>
<li>
<span class="keyword">finally</span>
:</li>
<li>
<span class="keyword">try</span>
:db.close()</li>
<li>
<span class="keyword">except</span>
:<span class="keyword">pass</span>
</li>
</ol>
</div>
<p></p>
<p>总结:</p>
<p>1. adodbapi简单,不用写一串的sql语句,但是不能取到返回的Error Code,只能取到返回的错误信息,也可能是我没找到方法</p>
<p>2. pymssql与第一条相反,可以取到返回值和错误信息,但要写sql语句。</p>
<p></p>
<p>这里重点说明一下使用pymssql的方法</p>
<p></p>
<p>cur.execute("exec 存储过程名 @参数1=XXX, @参数2='YYY'......")</p>
<p>cur.fetchone() #如果该存储过程中有返回结果集,可以调用此句,如果存储过程是return,则pymssql不支持,无法获取,此句错误</p>
<p>conn.commit() #如果没有此句,则数据并没有真正生效,比如存储过程是执行insert的,没有commit的话,并不会真正插入数据</p>
<p>一般通过此三步即可以应对很多使用存储过程的要求</p>
<p></p>
<p>对于存储过程传出数据的方法还有如下的讨论:</p>
<p>http://zh-cn.w3support.net/index.php?db=so&amp;id=191644</p>
<p></p>
<p></p>
<p></p>
<p></p>
<p></p>

你可能感兴趣的:(python)