ehxz 发表于 2008-3-5 21:47:25

[转帖]Sybase 存储过程(嵌套调用)使用另外一个存储过程的结果集

<font face="Verdana">
<div>/***********************************************</div>
<div>************************************************</div>
<div>Sybase存储过程(嵌套调用)使用另一个存储过程结果集</div>
<div>作者:王衍锋</div>
<div>日期:2008年3月5日</div>
<div>***********************************************</div>
<div>***********************************************/</div>
<div>&nbsp;</div>
<div>关于Sybase ASE 中存储过程嵌套调用,特别是主存储过程要使用子存储过程返回的结果集的情况,由于Sybase 中不支持T-SQL 中的行集函数openrowset和opendatasource两种方法,而且,目前版本(Sybase 12.5)不支持用户自定义函数,因此,给引用被调用子存储过程返回的结果集造成了很大的不方便性。这里介绍使用Sybase“现有表”来实现应用方法。</div>
<div>&nbsp;</div>
<div>例子:</div>
<div>首先建立一个存储过程p_Test,返回一个结果集</div>
<div>create procedure p_Test</div>
<div>@RCNID char(10)</div>
<div>as </div>
<div>begin</div>
<div><span>&nbsp;&nbsp;&nbsp; select RCNID,RCNDTE,NODENAM from JK_RCNNODE WHERE RCNID=@RCNID</span></div>
<div><span>&nbsp;&nbsp;&nbsp; return</span></div>
<div>end</div>
<div>&nbsp;</div>
<div>再建立一个存储过程,对p_Test存储过程进行嵌套调用,使用p_Test返回的结果集</div>
<div>Create procedure p_Main</div>
<div>as </div>
<div>begin</div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create existing table almsdb.dbo.tt /*</span>为要调用的存储过程建立现有表*/</div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (RCNID char(10) null,</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RCNDTE char(10) null,</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NODENAM varchar(100) null</span>,</div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _RCNID char(10) null</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; external procedure</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at 'local.almsdb.dbo.p_Test '</span></div>
<div>&nbsp;</div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select * from tt where RCNID='0000011312' /*</span>使用现有表--存储过程返回的记录集*/</div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; drop table tt</span></div>
<div>&nbsp;</div>
<div><span>&nbsp;&nbsp;&nbsp; return</span></div>
<div>end</div>
<div>&nbsp;</div>
<div>注释:</div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; almsdb.dbo.tt</span>:<span>&nbsp;&nbsp;&nbsp; </span>数据库名.拥有者.表名(其实是一个视图名称--只读)</div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; local </span>:Sybase ASE 数据库服务器名称(也可以是远程链接数据库服务器名)</div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>建立方法:</div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sp_addserver 'local', null, '10.232.27.147:4100'</span></div>
<div><span>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sp_addexternlogin 'local', 'almsdbo', 'almsdbo', 'almsalms'</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>注意上面两个系统存储过程的执行需要dbo的操作权限,由数据库管理员配制好就可使用。</div>
<div>&nbsp;</div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>现有表almsdb.dbo.tt的定义与存储过程返回的结果集相对应,包括数据类型、长度/精确度、小数点后的位数(scale)以及 null/not null 等特征。</div>
<div>&nbsp;</div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>现有表almsdb.dbo.tt只能接收存储过程返回的第一个结果集。</div>
<div>&nbsp;</div>
<div>/*******************************************/</div>
<div>改进一:</div>
<div>时间:2008/3/5</div>
<div>作者:王衍锋</div>
<div>描述:为了能够并行执行,将现有表改为临时现有表almsdb.dbo.tt--&gt;#tt</div>
<div>这样存储过程并行执行时就不会发生并发问题</div>
<div>/*******************************************/</div>
<div>改进二:</div>
<div>时间:2008/3/5</div>
<div>作者:王衍锋</div>
<div>描述:</div>
<div>关于存储过程的参数,如何实现包含参数的存储过程。在现有表中使用“_”的列来定义存储过程的参数,这些参数列不会在结果集中出现,但可以查询引用,CIS将通过名为@+列名的参数将搜索自变量传递到存储过程中。</div>
<div>/********************************************/</div>
<div>即将上面p_Main过程更改为:</div>
<div>&nbsp;</div>
<div>create existing table #tt </div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (RCNID char(10) null,</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RCNDTE char(10) null,</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NODENAM varchar(100) null,</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _RCNID char(10) null</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; external procedure</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at 'local.almsdb.dbo.p_Test '</span></div>
<div>&nbsp;</div>
<div>select * from #tt where RCNID='0000011312'&nbsp;</div>
<div>drop table #tt</div>
<p>&nbsp;</p>
<p></font>&nbsp;</p>
<p><font face="Verdana">FROM:</font></p>
<p><font face="Verdana">http://blog.csdn.net/lovcal/archive/2008/03/04/2147570.aspx</font></p>

qiezi 发表于 2008-3-24 18:47:43

<p>我先是定义了一个很复杂的动态sql语句,把它定义为一个存储过程,现在在另一个存储过程中要把该过程的返回结果数据集插入到临时表中,我的语句很简单,但是就是报错,这位大侠看来是为高手,帮下忙啊,我的代码是:</p>
<p>create table #t(a char(20))</p>
<p>insert into #t exec&nbsp; a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;报错为:&nbsp;<font face="Verdana">incorrect syntax near the keyword 'exec'</font></p>
<p>select *from #t</p>
<p>drop table #t</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>注:a是被调用的存储过程</p>
<p>用游标也是这个问题</p>
<p>&nbsp;</p>
<p>&nbsp;</p>

qiezi 发表于 2008-3-24 18:48:29

帮下忙
页: [1]
查看完整版本: [转帖]Sybase 存储过程(嵌套调用)使用另外一个存储过程的结果集

免责声明:
本站所发布的一切破解补丁、注册机和注册信息及软件的解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:Admin@SybaseBbs.com