这是为什么?

xuzuning 2010-09-01 04:39:10
create cursor temp (v c(2))
insert into temp values ('a')
insert into temp values ('b')
insert into temp values ('c')

select foo() from temp

function foo()
? recno(), v
return v
endfunc


打印出的结果
1 a
1 a
2 b
3 c

也就是说,函数 foo 被调用了4次
这是为什么?
...全文
294 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
十豆三 2010-09-02
  • 打赏
  • 举报
回复
Clear
Create Cursor temp (v c(2))
Insert Into temp Values ('a')
Insert Into temp Values ('b')
Insert Into temp Values ('c')

i = 0
Select v+foo(), v+foo() From temp
*select foo() from temp

Function foo()
? Recno()
Return v
Endfunc


将显示:
1
1
1
1
1
1
2
2
3
3
xuzuning 2010-09-02
  • 打赏
  • 举报
回复
并且
create cursor temp (v c(2))
insert into temp values ('a')
insert into temp values ('b')
insert into temp values ('c')

i = 0
select v+foo(), v from temp
*select foo() from temp

function foo()
? recno()
return v
endfunc

将打印出
1
1
1
2
3

非常不可思议
wwwwb 2010-09-02
  • 打赏
  • 举报
回复
没有VFP的源码,在其它数据库中测试了一下,MYSQL、ASA(ASE)、SQLSERVER,没有这种情况,
呵,VFP确实比较特殊
十豆三 2010-09-02
  • 打赏
  • 举报
回复
应该是运行
select foo() from temp
之前
VFP内部尝试foo()能否成功,或者说尝试此函数是否存在,如果成功了才执行select foo() from temp
所以就发生了多执行了一次foo()

如:下面foo()中有错误,select没有执行,但VFP尝试了foo(),也就是说内部执行了一次
例子可能不是十分恰当

Clear
Close Databases All

Create Cursor temp (v c(2))
Insert Into temp Values ('a')
Insert Into temp Values ('b')
Insert Into temp Values ('c')

Select foo() From temp

Function foo()
On Error Cancel
? Recno(), v
898 && 报错
Return v
Endfunc
都市夜猫 2010-09-02
  • 打赏
  • 举报
回复
感觉上也没什么好奇怪的,第一次应该是在扫描,得出每个目标字段的类型和长度等信息,用来构造目标表结构,然后才开始提取符合条件的记录到目标表。
WWWWA 2010-09-02
  • 打赏
  • 举报
回复
没有,我用的就是VFP9,还是有此问题
xuzuning 2010-09-02
  • 打赏
  • 举报
回复
那么在 vfp6 就有的,到 vfp9 还没解决吗?
WWWWA 2010-09-02
  • 打赏
  • 举报
回复
记得在VFP帮助中有一段,大意是避免在SQL语句中使用,估计已经是发现了此问题
xuzuning 2010-09-02
  • 打赏
  • 举报
回复
还有更进一步的解释吗?

这是一个事实,看来只能写代码避开了。肯定很别扭的
WWWWA 2010-09-02
  • 打赏
  • 举报
回复
估计VFP在执行SQL语句与函数时没有同步
xilaianzxsc 2010-09-02
  • 打赏
  • 举报
回复
第一次,指针没有移动。 确实如此
WWWWA 2010-09-01
  • 打赏
  • 举报
回复
CLEAR ALL
CLEAR
SET SAFETY OFF
create table temp (v c(2))
insert into temp values ('a')
insert into temp values ('b')
insert into temp values ('c')
CLEAR ALL
SELECT *,foo(RECNO())from temp

function foo(ff)
*? recno(), v,ff
return recno()
endfunc

只有在第1条记录时,? recno()运行了两次
WWWWA 2010-09-01
  • 打赏
  • 举报
回复
CLEAR ALL
CLEAR
SET SAFETY OFF
create table temp (v c(2))
insert into temp values ('a')
insert into temp values ('b')
insert into temp values ('c')
CLEAR ALL
SELECT *,foo(RECNO())from temp

function foo(ff)
? recno(), v,ff
return v
endfunc
ACMAIN_CHM 2010-09-01
  • 打赏
  • 举报
回复
第一次,指针没有移动。
xuzuning 2010-09-01
  • 打赏
  • 举报
回复
确实是函数 foo 被执行了4次
改成这样
create cursor temp (v c(2))
insert into temp values ('a')
insert into temp values ('b')
insert into temp values ('c')

i = 0
select foo() from temp

function foo()
i = i+1
? i
return i
endfunc

查询结果
Exp_1
2
3
4

打印的结果
1
2
3
4
WWWWA 2010-09-01
  • 打赏
  • 举报
回复
create cursor temp (v c(2))
insert into temp values ('a')
insert into temp values ('b')
insert into temp values ('c')

SELECT *,foo() from temp

function foo()
*? recno(), v
return v
endfunc

看看结果
估计第一条记录在函数中执行了两次 ? recno(), v,指针没有移动

2,749

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧