免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3679 | 回复: 6
打印 上一主题 下一主题

请问ASE12.5不支持动态游标吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-23 16:20 |只看该作者 |倒序浏览
各位好!本人刚刚接触Sybase ASE,目前正在将Oracle上的存储过程移植到Sybase上。
原存储过程中类似这样的代码,用到了动态SQL和游标:
....
V_SQL := 'SELECT COUNT(1) FROM TABLE_' || V_TABLE_SUFFIX || ' WHERE A = xxx';
OPEN V_CURSOR1 FOR V_SQL;
....
也就是说,要满足2个要求:
1. SQL语句是动态生成的
2. 结果集需要进行后续处理,不能直接返回给客户端,这里Oracle的实现用了动态游标
翻查了Sybase的TSQL手册,外加Google了半天,发现ASE虽然支持动态SQL(exec),但似乎没有动态游标。

希望大家指教一下:
1. 是不是ASE中没有动态游标这一说?
2. 那么只能将结果放在临时表中,再行处理?
3. 除2以外,有没有更好的处理方式?

[ 本帖最后由 protobe 于 2009-3-23 16:23 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-03-23 16:36 |只看该作者
1应该是说游标+动态sql ,完全没有问题!也和oracle类似
2不太明白意思,如果是针对动态sql产生的结果集进行后续处理,临时表相当不错!

论坛徽章:
0
3 [报告]
发表于 2009-03-23 16:59 |只看该作者
原帖由 chenfeng825 于 2009-3-23 16:36 发表
1应该是说游标+动态sql ,完全没有问题!也和oracle类似
2不太明白意思,如果是针对动态sql产生的结果集进行后续处理,临时表相当不错!


可能我说的不太清楚,比如Oracle这里,可以这样写:
-- 声明

V_SQL VARCHAR(1024);
V_CURSOR1 ECIPCURSOR;
....

V_SQL   := 'SELECT COUNT(1) FROM USER_TABLES WHERE TABLE_NAME = ''NKWAP_' || V_TABLE_SUFFIX || '''';
OPEN V_CURSOR1 FOR V_SQL;
....



但在ASE里,它声明CURSOR的时候,不是要把select语句也定下来嘛,那我怎么把一个动态的SQL再跟一个游标关联起来呢?
declare cursor_name cursor for select_statement [for{read only | update [of column_name_list]}]

我在12.5的那本TSQL用户指南里好像只能看到上面的这种定义

[ 本帖最后由 protobe 于 2009-3-23 17:00 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2009-03-23 17:03 |只看该作者
1> declare cur cursor for select "select count(1) from "+name from sysobjects where type='U'
2> go
1> declare @sql varchar(200)
2> open cur
3> fetch cur into @sql
4> while @@sqlstatus = 0
5>  begin
6>     exec(@sql)
7>     fetch cur into @sql
8> end
9> go
1> deallocate cursor cur
2> go

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2009-03-23 19:03 |只看该作者
斑竹回帖是正解 。。。

论坛徽章:
0
6 [报告]
发表于 2009-03-24 09:14 |只看该作者
原帖由 chenfeng825 于 2009-3-23 17:03 发表
1> declare cur cursor for select "select count(1) from "+name from sysobjects where type='U'
2> go
1> declare @sql varchar(200)
2> open cur
3> fetch cur into @sql
4> while @@sqlstatus = 0
5 ...


呵呵,斑竹的写法很巧妙,不过,这跟我的需求有点差异呀。
我是希望 select count(1) from ... 这部分的结果能以游标形式返回让我处理

论坛徽章:
0
7 [报告]
发表于 2009-03-24 09:59 |只看该作者
原帖由 protobe 于 2009-3-24 09:14 发表


呵呵,斑竹的写法很巧妙,不过,这跟我的需求有点差异呀。
我是希望 select count(1) from ... 这部分的结果能以游标形式返回让我处理


前面说了,你可以先把动态sql这部分结果插入临时表。然后你想怎么着怎么着。


至于cursor至少15以前的版本,还是能避免避免吧,效率还是比较低的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP