Sybase存储过程(嵌套调用)使用另一个存储过程结果集


作者:王衍锋


日期:2008年3月5日


关于Sybase ASE 中存储过程嵌套调用,特别是主存储过程要使用子存储过程返回的结果集的情况,由于Sybase 中不支持T-SQL 中的行集函数openrowset和opendatasource两种方法,而且,目前版本(Sybase 12.5)不支持用户自定义函数,因此,给引用被调用子存储过程返回的结果集造成了很大的不方便性。这里介绍使用Sybase“现有表”来实现应用方法。


 


例子:


首先建立一个存储过程p_Test,返回一个结果集

create procedure p_Test 

 

  @RCNID char(10) 

 

  as 

 

  begin 

 
 
     select RCNID,RCNDTE,NODENAM from JK_RCNNODE WHERE RCNID=@RCNID 

 
 
     return 

 

  end

 


再建立一个存储过程,对p_Test存储过程进行嵌套调用,使用p_Test返回的结果集


Create procedure p_Main 

 

  as 

 

  begin 

 
 
        create existing table almsdb.dbo.tt /*为要调用的存储过程建立现有表*/ 

 
 
               (RCNID char(10) null, 

 
 
               RCNDTE char(10) null, 

 
 
               NODENAM varchar(100) null, 

 
 
               _RCNID char(10) null 

 
 
               ) 

 
 
        external procedure 

 
 
        at 'local.almsdb.dbo.p_Test ' 

 

    

 
 
        select * from tt where RCNID='0000011312' /*使用现有表--存储过程返回的记录集*/ 

 
 
        drop table tt 

 

    

 
 
     return 

 

  end


 


注释:


       almsdb.dbo.tt:     数据库名.拥有者.表名(其实是一个视图名称--只读)


       local :Sybase ASE 数据库服务器名称(也可以是远程链接数据库服务器名)


      


       建立方法:


           

sp_addserver 'local', null, '10.232.27.147:4100' 

 
 
             sp_addexternlogin 'local', 'almsdbo', 'almsdbo', 'almsalms'


       注意上面两个系统存储过程的执行需要dbo的操作权限,由数据库管理员配制好就可使用。


 


       现有表almsdb.dbo.tt的定义与存储过程返回的结果集相对应,包括数据类型、长度/精确度、小数点后的位数(scale)以及 null/not null 等特征。


 


       现有表almsdb.dbo.tt只能接收存储过程返回的第一个结果集。


 


改进一:


时间:2008/3/5


作者:王衍锋


描述:为了能够并行执行,将现有表改为临时现有表almsdb.dbo.tt-->#tt


这样存储过程并行执行时就不会发生并发问题


改进二:


时间:2008/3/5


作者:王衍锋


描述:


关于存储过程的参数,如何实现包含参数的存储过程。在现有表中使用“_”的列来定义存储过程的参数,这些参数列不会在结果集中出现,但可以查询引用,CIS将通过名为@+列名的参数将搜索自变量传递到存储过程中。

即将上面p_Main过程更改为:


 

create existing table #tt 

 
 
        (RCNID char(10) null, 

 
 
        RCNDTE char(10) null, 

 
 
        NODENAM varchar(100) null, 

 
 
        _RCNID char(10) null 

 
 
        ) 

 
 
        external procedure 

 
 
        at 'local.almsdb.dbo.p_Test ' 

 

    

 

  select * from #tt where RCNID='0000011312'  

 

  drop table #tt