资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第,9,章 数据库应用系统开发工具,PB,*,每一种编程语言都有自己的约定,,PB,也不例外。,PowerScript,是,PB,的编程语言,事件处理程序、自定义函数等的编写都是使用,PowerScript,编写的。由于我们已学习了一种或几种高级语言(如,C,语言),在此仅对,PowerScript,作一简单介绍。,9,4,PowerScript,语言介绍,9.4.1,PowerScript,基本概念,9.4.2,常量、变量、函数和表达式,9.4.3,PowerScript,语句,9.4.4,嵌入式,SQL,与动态,SQL,语句,9.4.5,函数与事件的调用,9.4.6 ORACLE,的存储过程和函数调用,9,4,PowerScript,语言介绍,1,空值,空值是关系数据库中的一个特殊概念,可以将其认为一个特定的值,也可以将其认为不确定的值。空值不是空字符串,也不是数字,0,。用,NULL,表示空值。,在,PowerScript,中不能用赋值语句对变量赋,NULL,值,而应使用函数,SetNULL,(),对变量赋,NULL,。也不能将,NULL,用于比较运算,而须使用函数,IsNULL,(),来判断表达式是否为,NULL,。,在,SQL,的,INSERT,和,UPDATE,中可以使用,NULL,将表中字段设置为空值。,9.4.1,PowerScript,基本概念,2,代词,PowerScript,可以使用代词来引用对象或控件,这样可以增加程序代码的通用性。,PowerScript,中的代词有:,Parent,、,This,和,Super,。,(,1,),Parent,Parent,引用当前对象的父对象或包含当前对象的对象,它可用于窗口中的控件、用户对象的控件和菜单等。,(,2,),This,This,用于引用当前对象自身的属性或事件等。它可用于窗口、用户对象、菜单、应用对象和各种控件等。,9.4.1,PowerScript,基本概念,(,3,),Supper,子对象或控件中的程序可以调用祖先对象或控件中的程序,可以直接使用祖先的名称调用,也可使用代词,Supper,来调用。这里所说的子对象与祖先对象是有继承关系的两个对象。,调用祖先对象函数的格式为:,Supper:,函数名(参数),调用祖先对象事件的格式为:,Call Supper:,事件名,或:,Supper:event,(,事件名,),9.4.1,PowerScript,基本概念,常量、变量、函数和表达式是所有程序设计语言的重要组成部分,在此只介绍,PowerScript,的特殊部分。,1,数据类型,PowerScript,的数据类型可分为标准数据类型、可变数据类型、系统对象数据类型和枚举数据类型。,(,1,)标准数据类型,标准数据类型是我们在高级程序设计语言中所熟悉的数据类型,如,Char,、,Int,,在此不作介绍。,(,2,)可变数据类型,可变数据类型(,Any,类型)变量可以保存任意数据类型的值。可用赋值语句给,Any,类型的变量赋值,赋值后,变量类型也随之变化。,9.4.2,常量、变量、函数和表达式,(,3,)系统对象数据类型,系统对象数据类型是,PowerScript,的一种特殊类型。在,PB,中窗口、菜单、各种控件都是系统对象。有时为建立系统对象的不同实例,需要定义具有系统对象数据类型的变量。,(,4,)枚举数据类型,枚举数据类型常用作函数参数或指定对象或控件的属性。即在,PB,中有些函数的参数、对象或控件的属性是枚举数据类型的。,应当注意的是用户不能定义枚举数据类型的变量,且在每一枚举值之后应加上,“,!,”,。,9.4.2,常量、变量、函数和表达式,2,常量,常量的使用与我们所学过的高级语言类似,在此仅介绍符号常量的定义。符号常量是将一个标识符说明为一个常量,它的作用主要是用来提高程序的可读性和可移植性。其格式为:,CONSTANT,权限,类型 常量名,=,常量值,或:,权限,CONSTANT,类型 常量名,=,常量值,其中权限为,PRIVATE(,私有,),、,PROTECTED,(保护)和,PUBLIC,(公共)。,例如:说明,pi,是一个公共常量的语句为:,CONSTANT PUBLIC REAL pi=3.14159,9.4.2,常量、变量、函数和表达式,3,变量,(,1,)全局变量,在整个应用程序内有效,它独立于任何对象。可以在窗口、用户对象、菜单或其它对象的脚本中定义全局变量。,(,2,)实例变量,属于定义它的对象并与该对象的一个实例有关,可以将其看作对象的一个属性。实例变量与定义它的对象实例同时建立和撤消。,9.4.2,常量、变量、函数和表达式,(,3,)共享变量,属于定义它的对象并在这个对象的所有实例中引用。共享变量在定义它的对象关闭时并不撤消,其值保持不变,再次打开该对象可继续使用该值。共享变量只能在定义它的对象脚本中引用。可以在窗口中、用户对象、菜单或应用对象中定义共享变量。,(,4,)局部变量,局部变量在使用它的事件处理函数或自定义函数中说明。程序段内只能引用在其内部定义的局部变量。局部变量在定义它的脚本中执行时建立,在脚本执行完成后立即释放。,9.4.2,常量、变量、函数和表达式,PowerScript,中的函数分为内部函数、用户自定义函数、外部函数和远程过程调用(,Remote procedure call,简称为,RPC,)。,内部函数由系统函数和对象函数组成,系统函数与任何对象无关的并由,PowerScript,提供,这些函数完成一些公共的计算和处理功能。,用户自定义函数是用户根据需要定义的函数,用户可定义全局函数,也可定义对象函数。,外部函数是指使用其它语言编写并保存在动态链接库中的函数,在使用外部函数时必须进行说明。,系统函数的调用与其它高级语言函数的调用一致。对象函数的调用格式为:,对象名,.,函数名(参数值表)。,9.4.2,常量、变量、函数和表达式,5,表达式,表达式是由常量、变量、函数和运算符等构成的。,PowerScript,支持四类运算符:算术运算符、关系运算符、逻辑运算符和字符串连接运算符。它们的使用与其它高级语言类似,但应注意的是:减号(,-,),在一般情况下,“,-,”,被认为是连字符,在表达式中要将,“,-,”,作为减号来使用时必须在它的前后都加上一个空格。,9.4.2,常量、变量、函数和表达式,1,赋值语句,赋值语句给变量或对象的属性赋值。给变量赋值的格式为:变量名,=,表达式。给对象的属性赋值的格式为:对象名,.,属性名,=,表达式。应当注意的是,PowerScript,不允许一次给多个变量或属性赋值。同时与,C,语言类似,,PowerScript,提供了一些简化的赋值运算符,如,“,+,”,。,2,分支结构,PowerScript,提供的分支结构有条件语句和多分支语句。,(,1,)条件语句,条件语句根据特定条件选择执行不同的语句,它分为单行格式和多行格式。,9.4.3,PowerScript,语句,单行格式如下:,IF,条件,THEN,语句,1 ELSE,语句,2,多行格式:,IF,条件,1 THEN,语句组,1,ELSEIF,条件,2 THEN,语句组,2,ELSE,语句组,END IF,9.4.3,PowerScript,语句,(,2,)多分支结构,CHOOSE CASE,语句是用来进行多分支选择的,其格式如下:,CHOOSE CASE,表达式,CASE,表达式,1,语句组,1,CASE,表达式,2,语句组,2,CASE,表达式,n,语句组,n,CASE ELSE,语句组,END CHOOSE,9.4.3,PowerScript,语句,3,循环结构,PowerScript,的循环语句有,5,种,其格式分别如下:,格式,1,:,DO UNTIL,条件,语句组,LOOP,该语句当条件不成立时执行语句组,直到条件成立时结束循环。,格式,2,:,DO,语句组,LOOP UNTIL,条件,该语句先执行语句组,然后检测条件是否成立,若条件不成立继续执行语句组,若条件成立,则结束循环。,9.4.3,PowerScript,语句,格式,3,:,DO WHILE,条件,语句组,LOOP,该语句当条件成立时执行语句组,当条件不成立时结束循环。,格式,4 DO,语句组,LOOP WHILE,条件,该语句先执行语句组,然后检测条件是否成立,若条件成立继续执行语句组,否则结束循环。,格式,5 FOR,循环变量,=,初值,TO,终值,STEP,步长,语句组,NEXT,9.4.3,PowerScript,语句,4,CALL,语句,CALL,语句用于在了对象中调用祖先对象中的函数或事件。可以调用菜单、用户对象、窗口等祖先对象中的事件或函数,也可以调用用户对象或窗口祖先对象中控件的事件。其格式如下:,CALL,祖先对象名,控件名,:事件名。,5,建立与删除对象实例语句,CREATET,和,DESTROY,语句分别用来创建和删除对象实例。,(,1,),CREATE,语句,CREATE,语句根据指定的对象类型建立一个对象实例,该语句的返回结果为存储在同一类型的变量中的对象实例。在对象实例被创建后可以引用对象实例的属性。,9.4.3,PowerScript,语句,该语句有两种格式,一种是静态指定对象类型,另一种是动态指定对象类型。它们的格式如下:,格式,1,:对象变量,=CREATE,对象类型,此语句为对象变量创建一个指定对象类型的对象实例。,格式,2,:对象变量,=CREATE USING,对象类型字符串,该语句根据对象字符串中指定的对象类型建立一个对象实例。,(,2,),DESTROY,语句,DESTORY,语句删除由,CREATE,语句建立的对象实例。用,CREATE,语句建立的对象实例在使用完毕后应使用该语句及时释放,使对象实例所占用的内存资源得到重新使用。该语句格式为:,DESTROY,对象变量,9.4.3,PowerScript,语句,在,PB,应用程序开发过程中,在多数情况下对数据库的操作是通过数据窗口进行的,但数据窗口并不是万能的,有时我们需要利用,SQL,语句对数据库进行操作。,PowerScript,提供了嵌入式,SQL,语句与动态,SQL,语句。,1,嵌入式,SQL,在,PowerScript,的脚本中可以使用标准,SQL,语句,但在标准,SQL,语句的后面应加上,“,USING,事务对象名;,”,,如果所使用的事务对象是,SQLCA,,则只需在,SQL,语句后加上,“,;,”,即可。例如连接数据库命令为:,CONNECT USING SQLCA,;,如果在,SQL,语句中使用变量,应在变量之前加上,“,:,”,。,应该注意的是:在,SQL,语句中使用的函数应该是数据库系统的函数,而不是,PB,的函数。,9.4.4,嵌入式,SQL,与动态,SQL,语句,2,动态,SQL,(,1,)既无输入参数、也无结果集的动态,SQL,语句,该类型,SQL,语句格式为:,EXECUTE IMMEDIATE,字符串,USING,事务对象名,;,(,2,)有输入参数、但无结果集的动态,SQL,语句,该类型动态,SQL,语句能够处理设计时已经知道,SQL,语句的参数个数,且该,SQL,语句没有返回值。它可以在运行时定义参数的数据操作语句。其格式如下:,PREPARE,动态策略区变量,FROM,字符串,USING,事务对象名,;,EXECUTE,动态策略区变量,USING,参数值表;,9.4.4,嵌入式,SQL,与动态,SQL,语句,9.4.4,嵌入式,SQL,与动态,SQL,语句,其中动态策略区(,DynamicStagingArea,)变量是类型为,DynamicStagingArea,的对象变量,通常使用,SQLSA,,这里动态策略区用于准备,SQL,语句以及所需参数个数。字符串的内容是一有效,SQL,语句,使用“?”代表所需参数。应该注意参数值表中参数值的顺序必须对应于字符串中?的顺序。,例,9-2,使用动态,SQL,语句,删除指定物资编码的记录。程序段如下:,string,vwzbm,=010101,PREPARE SQLSA FROM“delete from,wzbmb,where,wzbm,=?”;,EXECUTE SQLSA USING:,vwzbm,;,9.4.4,嵌入式,SQL,与动态,SQL,语句,(,3,)编译时已知道参数和结果集的动态,SQL,语句,该类动态,SQL,语句处理参数和结果集在编译时已知的情况下,它有两种形式:使用游标和使用存储过程。,使用游标形式的语法格式和程序中语句出现次序为:,DECLARE,游标名,DYNAMIC CURSOR FOR,动态策略区变量;,/,说明动态游标,PREPARE,动态策略区变量,FROM,字符串,USING,事务对象名,;/,准备动态策略区,OPEN DYNAMIC,游标名,USING,参数值表,;,/,打开动态游标,9.4.4,嵌入式,SQL,与动态,SQL,语句,FETCH,游标名,INTO,变量表;,/,读取行数据,CLOSE,游标名;,/,关闭动态游标,使用存储过程形式的语法格式和程序中语句出现次序为:,DECLARE,存储过程名,DYNAMIC PROCEDURE FOR,动态策略区变量;,/,说明动态过程,PREPARE,动态策略区变量,FROM,字符串,USING,事务对象名,;/,准备动态策略区,EXECUTE DYNAMIC,存储过程名,USING,参数值表,;,/,执行动态过程,FETCH,存储过程名,INTO,变量表;,/,读取行数据,CLOSE,存储过程名;,/,关闭动态过程,其中字符串的内容是一有效,SQL,语句,如果有变量,变量名前加上“:”,用“?”代表参数。,9.4.4,嵌入式,SQL,与动态,SQL,语句,例,9-3,利用游标方式实现一个带参数的动态查询。其程序段如下:,DECLARE,wzbm_cursor,DYNAMIC CURSOR FOR SQLSA,;,String,vwzmc,String,vwzbm,=,010102,PREPARE SQLSA FROM,“,SELECT,wzmc,from,wzbmb,where,wzbm,=?,”,;,OPEN DYNAMIC,wzbm_cursor,USING,:,vwzbm,;,FETCH,wzbm_cursor,INTO,:,vwzmc,;,CLOSE,wzbm_cursor,;,请读者考虑如何使用存储过程方式实现例,9-3,的功能。,9.4.4,嵌入式,SQL,与动态,SQL,语句,(,4,)不知道参数和结果集的动态,SQL,语句,该类动态,SQL,语句能处理在编译时不知道参数和结果集,SQL,语句,它有两种形式:使用游标和使用存储过程。,使用游标形式的语法格式和程序中语句出现次序为:,DECLARE,游标名,DYNAMIC CURSOR FOR,动态策略区变量;,/,说明动态游标,PREPARE,动态策略区变量,FROM,字符串,USING,事务对象名,;/,准备动态策略区,DESCRIPBE,动态策略区变量,INTO,动态描述区变量;,OPEN DYNAMIC,游标名,USING DESCRIPTOR,动态描述区变量;,/,打开动态游标,FETCH,游标名,USING DESCRIPTOR,动态描述区变量;,/,读取行数据,CLOSE,游标名;,/,关闭动态游标,9.4.4,嵌入式,SQL,与动态,SQL,语句,使用存储过程形式的语法格式和程序中语句出现次序为:,DECLARE,存储过程名,DYNAMIC PROCEDURE FOR,动态策略区变量;,/,说明动态过程,PREPARE,动态策略区变量,FROM,字符串,USING,事务对象名,;/,准备动态策略区,DESCRIPBE,动态策略区变量,INTO,动态描述区变量;,EXECUTE DYNAMIC,存储过程名,USING DESCRIPTOR,动态描述区变量;,/,执行动态过程,FETCH,存储过程名,USING DESCRIPTOR,动态描述区变量;,/,读取行数据,CLOSE,存储过程名;,/,关闭动态过程,9.4.4,嵌入式,SQL,与动态,SQL,语句,其中字符串的内容是一有效,SQL,语句,如果有变量,变量名前加上“:”,用“?”代表参数。动态描述区变量是类型为,DynamicDescriptionArea,的对象变量,可选系统默认的全局变量,SQLDA,。通过动态描述区变量的 四个属性:,NumInputs,、,InParmType,、,Numouputs,、,OutParmType,可以得到输入参数个数、输入参数类型、输出参数个数、输出参数类型 的信息,其中,InParmType,是一个数组,每个元素依次对应于,SQL,语句中 的一个“?”。,OutParmType,也是一个数组,每个元素依次对应于一个输 出参数。,InParmType,和,OutParmType,的数据类型是枚举数据类型,其 值主要为:,TypeInteger,!,、,TypeDecimal,!,、,TypeDouble,!,、,TypeLong,!,、,Typereal,!,、,TypeUnsignedInteger,!,、,TypeUnsignedLong,!,、,TypeBoolean,!,、,Typestring,!,、,TypeDate,!,、,TypeTime,!,、,TypeDateTime,!,。,9.4.4,嵌入式,SQL,与动态,SQL,语句,通过使用该对象变量的函数,SetDynamicParm,(,动态描述区变量名,输入参数序号,参数值,),设置具体的输入参数。通过,GetDynamicNumber,(),、,GetDynamicString,(),、,GetDynamicDate,、,GetDynamicTime,、,GetDynamicDateTime,(),得到输出参数的值,函数的选择应根据输出参数的数据类型来确定,这些函数都有两个参数,第一个为动态描述区变量,第二个为输出参数序号。如果该动态,SQL,语句有输入参数,应在,OPEN DYNAMIC,或,EXECUTE DYNAMIC,语句之前利用,SetDynamicParm,()函数设置输入参数值。,9.4.4,嵌入式,SQL,与动态,SQL,语句,例,9-4,利用游标方式实现有参数的动态查询。其程序段如下:,DECLARE,wzlk_cursor,DYNAMIC CURSOR FOR SQSA,;,PREPARE SQLSA FROM“select,wzbm,from,wzlkb,where,dwbm,=?”;,DESCRIPBE SQLSA INTO SQLDA,;,SetDynamicParm(SQLDA,1,0101),OPEN DYNAMIC,wzlk_cursor,USING DESCRIPTOR SQLDA,;,FETCH,wzlk_cursor,USING DESCRIPTOR SQLDA,;,/,得到第一条记录,/,利用循环语句可得到其它满足条件的记录,CLOSE,wzlk_cursor,;,请读者完成上述程序片段,并利用存储过程方式实现相同的功能。,PB,对象有内置的函数和事件,用户也可以为对象定义用户事件或函数。事件(,Event,)是对象或控件内可以触发一段程序执行的一个动作。用户可以通过一个动作触发某个事件,也可在另一程序段中用语句触发事件。事件分为用户事件和对象内置事件。用户事件是为扩展对象的功能由用户定义的事件,用户可为用户事件定义参数和返回值,用户事件一般通过另一事件中的语句触发。内置事件是,PB,系统定义的对象的一部分,它通常是由用户的动作或系统的信息触发。,调用函数或事件的格式为:,对象名,.,类型,调用方式,执行方式,函数或事件名(,参数值表,),9.4.5,函数与事件的调用,1.,存储过程的调用,在,PB,中调用,Oracle,的存储过程主要分为如下四步:,定义一个存储过程变量,其格式如下:,DECLARE,procedure_variety,PROCEDURE FOR,procedure_name(argument,_value1,,,argument _value2,,,);,参数传递时也可采用名表示法。,执行存储过程,其格式为:,EXCUTE,procedure_variety,;,获得存储过程执行后的返回结果集,其格式为:,FETCH,procedure_variety,INTO,variety_list,;,9.4.6 ORACLE,的存储过程和函数调用,关闭存储过程,其格式为:,CLOSE,procedure_variety,;,例,9-5,调用第,8,章定义存储过程,Proc_wzbm_back1,。可设计如下的代码:,string,vno,vno,=010201,declare vproc_wzbm_back1 for proc_wzbm_back1(:vno);,execute vproc_wzbm_back1;,close vproc_wzbm_back1;,9.4.6 ORACLE,的存储过程和函数调用,9.4.6 ORACLE,的存储过程和函数调用,在上述程序代码中,因为该存储过程没有输出参数,因而没有第,3,步。,在,PB,中调用包中存储过程的方法与,PB,中调用存储过程方法一致,不同之处是要在存储过程名前加上包名。,2,ORACLE,的函数调用,在,PB,中调用,Oracle,的自定义函数时,只能在,SQL,语句中使用。,调用,f_date,函数的,SQL,命令如下:,Select,f_date,()into:a from dual;,其中,a,为变量。,
展开阅读全文