在PowerScript语言中直接调用SQL操作数据库的方式
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在Pow e rSc r i p t语言中
Ξ
直接调用SQ L操作数据库的方式
沈中林
(新疆大学数学系, 乌鲁木齐830046)
摘要讨论了在Pow e r B u ild 软件开发中, 用Pow e r Sc r i p t 语言直接调用SQ L语句完成对数据库操作的几种方式, 并通过举例说明每种方式的适用范围及注意事项, 对用Pow e r B u ilde r开
发软件具有参考及作用指导1
关键词Pow e r Sc r i p t S Q L
Pow e rB u ild 对数据库的操作即可以通过数据窗口完成( 本质上是数据窗口把在屏幕上对数据库的操作转化成SQ L 语句) , 又可以在Pow e rSc r i p t 语言中直接调用SQ L或存储过程( 本质上仍是SQ L 语句) 完成1 下面阐述在Pow e rSc r i p t 程序中调用SQ L 和存储过程的方式及其一些注意事项, 并给出简单的例子, 这对用Pow e rB u ild 开发软件具有参考及作用指导1
1 SEL EC T
语句查询返回一行
如果SQ L SEL EC T语句返回的结果只有一行, 可以在Pow e rSc r i p t 中书写以下的语句: SEL EC T
列名1, 列名2, 列名3,
I N TO :变量1, : 变量2, : 变量3,
FROM
表名1, 表名2, 表名3,
W H ER E ;
其中, ‛变量1‛, ‛变量2‛和‛变量3‛等都是Pow e r Sc r i p t 语言的变量1 该语句的作用是把数据库表的‛列名1‛, ‛列名2‛和‛列名3‛等列的值从数据库中取出, 然后放入对应的变量‛变量1‛, ‛变量2‛和‛变量3‛中1 例如:
S t r i n g n a m e, age
SEL EC T n a m e, age I N TO : n a m e, : age FROM s tu d en t
W H ER E s tu d en t co d e= ’199****1001’;
该语句仅仅适合于查询到一条记录的情况, 如果查询到的记录是多条, 则要用下面的方法1
2
查询多行
SEL EC T 是描述型的语言, 它面向的是集合, 是一组记录1 而Pow e rSc r i p t 语言却是面向过程的, 它是一条条地接受并处理记录1Pow e rSc r i p t 通过描述型光标(C U R SO R ) 在这组记录上游动的方法, 给Pow e r Sc r i p t 语句逐个地传送记录, 建立了集合与记录间的内在联系1 请看Ξ收稿日期: 1999- 03- 20
下例:
S t r i n g n a m e
S t r i n g V 1= ’1999% ’
D ECL A R
E C 1 C U R SO R FO R
SEL EC T n a m e FROM s tu d en t
W H ER E s tu d en t co d e L IK E: V 1
∥定义光标, 光标名为C 1
∥光标对应的SEL EC T语句
∥SEL EC T语句中用到了变量V 1
∥打开光标, 此时执行此光标对应的SEL EC T语句O P EN C 1;
L ab 1:
∥取记录, 光标下移一条
∥取记录成功
∥如果成功取出记录, 则取下一条
F E T CH C 1I N TO : n a m e;
If SQ L CA. SQ L C O D E = 0 T H EN
Go to L ab 1
1999% ‛替换, 因此最后执行的SQ L SEL EC T语句为:
1999% ’
1 每执行一次语句:
F E T CH C 1I N TO : n a m e;
则取出一条记录送给变量n a m e, 然后光标移到下一条记录1 如果想控制查询结果的次序, 必须在SEL EC T语句中用O RD ER B Y 子句, 否则, 没有其他的办法1 我们不可能一下子把光标定位在某条记录上, 只能从第一条开始, 一个个地下移1
在这里要注意光标带来的当前值的混乱现象1 在多个事务并发执行时, 事务的修改可能产生副作用, 使与光标有关的事务出错1 例如:
事务T 1 在时刻t3 读出一条不满足条件的记录, 这种光标当前值的混乱不易发现, 但有时会导致严重的后果1
我们在Syb a s e 上作如下实验1 第一个用户运行下面的程序:
s t r i n g n a m e
i n t I
∥定义光标, 执行此光标对应的SQ L 语句
D ECL A R
E C 1 C U R SO R FO R
SEL EC T n a m e FROM s tu d en
W H ER E n a m e L IK E‘王% ’
O P EN C 1;
L ab 1:
F E T CH C 1 I N TO : n a m e ; ∥取记录
If SQ L C A 1SQ L C O D E = 0 T H EN
If n a m e = ‘王涛’T H EN
DO W H I L E I < 10000
I = I + 1
L O O P ∥用循环来等待
∥对‛王涛‛这条记录进行处理
E n d if
Go to L ab 1
E n d if
Comm it ; ∥如果成功取出记录, 则取下一条
此程序查询‛王涛‛这条记录时, 用一个循环等待 1 此时第二个用户用 Syb a s e 的 isq 1 修 改‛王涛‛这条记录:
up d a t e s tu d en t se t n a m e= ’ 李涛 ’w h e r e n a m e= ’ 王涛‘
go
comm it
go
此时, ‛王涛‛已改为‛李涛‛, 已不具备光标查询时的查询条件: W H ER E n a m e L i k e ‘王% ’
如果第一个用户的程序继续运行下去, 后果是难以预料的 1
为了防止在光标查询到提交这段时间内其他用户修改表 s tu d en t 的内容, 对于数据库 Syb a s e, 上面的光标定义程序应写为:
s t r i n g n a m e
i n t I
∥定义光标, 执行此光标对应的 SQ L 语句
D ECL A R
E C 1 C U R SO R FO R ∥持续共享锁直到事务完成
SEL EC T n a m e FROM s tu d en t h o ld lock W H ER E n a m e L IK E
‘王% ’ O P EN C 1;
L ab 1:
F E T CH C 1 I N TO : n a m e
If SQ L CA . SQ L C O D E = 0 T H EN
If n a m e = ‛王涛‛T H EN
DO W H I L E I < 10000
I = I + 1
L O O P
∥对‛王涛‛这条记录进行处理
E n d IF
Go to L ab 1
E d IF
∥提交事务, 释放 h o l d ba c k 所加的锁
Comm it; 如果使用的是 O RA CL E 数据库, 应该用 SEL EC T fo r up d a t e 语句加锁
当前光标操作
3 当用光标取到某条记录后, 可以对这条记录进行修改和删除 1 下列是从表 s tu d en t 中查询记录, 如果姓名为‚王涛‛, 则删除‚王涛‛这条记录, 如果姓名为‚李涛‛则修改这条记录 1 S t r i n g n a m e
S t r i n g V 1= ’1999% ’
∥定义光标, 执行此光标对应的 SQ L 语句
D ECL A R
E C 1 C U R SO R FO R
SEL EC T n a m e FROM s tu d en t
W H ER E s tu d en t co
d e L IK E : V 1; O P EN C 1;
L ab 1:
F E T CH C 1 I N TO : n a m e
If SQ L CA . SQ L C O D E = 0 T H EN If n a m e = ‛王涛‛T H EN
D e l e t e F rom s tu d en t W H ER
E C U R R EN T O
F C 1;
E n d IF
If n a m e= ‛李涛‛T h e n
U p d a t e s tu d en t Se t n a t i o n a lity = ‚汉族‛W H ER E CU R R EN T O F C 1;
E n d If
Go to L ab 1
E n d If
删除当前光标对应记录的语法为:
D EL
E T E FROM T ab l eN am e W H ER E C U R R EN T O
F C u r s o rN am e ;
修改当前光标对应记录的语法为:
U PDA T E T ab l e N am e Se t S t a t em en t W H ER E CU R R EN T O F C u r s o r N am e ;
其 中, T ab l eN am e 指要从中删除 ( 修改) 当前行的表名, C u r s o r N am e 指定义的光标名,Se t S t a tem en t 是 Se t 语句 (为 Co lum nN am e = V a l u e 序列) 1
注意: 并不是所有的 DB M S 都支持 D EL E T E W H ER E CU R R EN T O F C u r s o r 删除光标所在行 1
指示变量
4 前面介绍了从数据库查询数据的方法, 如果取出的值有错, 或查出的数据为空, 则用前面的方法无法判断, 需要用指示变量来判定 1 这种判定方法与数据窗口的 SQ L C A 1SQ L C O D E
的工作方式是完全一样的, 请看下例:
∥指示变量
i n t ex t r ac t i n d s t r i n g n a m e, ex t rac t
SEL EC T n a m e, ex t rac t I N TO : n a m e, : ex t r ac t : ex t ra c t in d FROM s tu d en t
W H ER E s tu d en t co
d e= ’1999% ’; ∥正常返回
∥返回的 ex t rac t 值为空 If ex t rac t i n d = 0 T H EN If ex t rac t i n d = 1 T H EN 在上面的例子中, 用了一个指示变量 ex t ra c t in d , 它放在它要指示的变量 ex t rac t 的后
边,
() r i p t 语句中含有 U p d a t e, In s e r t 和 D e l e te 语句, 则这些语句会与数据窗口对数据库的更新合成一 个事务, 处理起来要小心 1 在 Pow e rSc r i p t 程序中合理正确的调用 SQ L 数据库的操作轻松自如, 否则会适得其反 1
语句, 会使得用户对 参 考 文 献
1 宜晨主编 1Pow e r B u ilde r 5. 0ƒ6. 0 编程指南 1 人民邮电出版社, 19981
2 [ 美 ]D a r y l B ibe r do rf 等著 1 陈向群等译 1Pow e r B u ilde r 5 开发人员指南 1 机械工业出版社, 19971
The D irec t W a y s of O pera t i n g D a ta b a se w ith SQ L
in PowerScr ip t L an gua g e
S h en Z h on g l in
(D ep a r tm en t o f M a th e m a t ic s X in jiang U n ive r sity , U rum q i X in jiang 830046)
A bs tra c t
T h is a r t ic le is co n ce rn ed w ith seve ra l d iff e ren t w ay s in com p le t in g da taba se p ro ce ss w ith SQ L d irec t l y
. It g ive s ex am p le s to illu st ra t e th e d iffe ren t a sp ec t s in w h ich th ey w ill ap p licab le an d p o in t o u t th e ite m s th a t sho u ld be p a id a t t en t i o n to . It h a s som e refe ren ced an d in st ruc t ive va lue i n exp lo ita t i o n o f so f t w a r e w ith Pow e r B u ilde r .
Key words PowerScr i p t SQL。