protobe 发表于 2009-03-23 16:20

请问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 编辑 ]

chenfeng825 发表于 2009-03-23 16:36

1应该是说游标+动态sql ,完全没有问题!也和oracle类似
2不太明白意思,如果是针对动态sql产生的结果集进行后续处理,临时表相当不错!

protobe 发表于 2009-03-23 16:59

原帖由 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 编辑 ]

chenfeng825 发表于 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

snow888 发表于 2009-03-23 19:03

斑竹回帖是正解 。。。

protobe 发表于 2009-03-24 09:14

原帖由 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:

chenfeng825 发表于 2009-03-24 09:59

原帖由 protobe 于 2009-3-24 09:14 发表 http://bbs3.chinaunix.net/images/common/back.gif


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

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


至于cursor至少15以前的版本,还是能避免避免吧,效率还是比较低的
页: [1]
查看完整版本: 请问ASE12.5不支持动态游标吗?