请问ASE12.5不支持动态游标吗?
各位好!本人刚刚接触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 编辑 ] 1应该是说游标+动态sql ,完全没有问题!也和oracle类似
2不太明白意思,如果是针对动态sql产生的结果集进行后续处理,临时表相当不错! 原帖由 chenfeng825 于 2009-3-23 16:36 发表 http://bbs3.chinaunix.net/images/common/back.gif
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用户指南里好像只能看到上面的这种定义:shock:
[ 本帖最后由 protobe 于 2009-3-23 17:00 编辑 ] 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 斑竹回帖是正解 。。。 原帖由 chenfeng825 于 2009-3-23 17:03 发表 http://bbs3.chinaunix.net/images/common/back.gif
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 ... 这部分的结果能以游标形式返回让我处理:em17: 原帖由 protobe 于 2009-3-24 09:14 发表 http://bbs3.chinaunix.net/images/common/back.gif
呵呵,斑竹的写法很巧妙,不过,这跟我的需求有点差异呀。
我是希望 select count(1) from ... 这部分的结果能以游标形式返回让我处理:em17:
前面说了,你可以先把动态sql这部分结果插入临时表。然后你想怎么着怎么着。
至于cursor至少15以前的版本,还是能避免避免吧,效率还是比较低的
页:
[1]