200 likes | 353 Views
第 12 章 SQL 语句. 12.1 嵌入式 SQL 语句 12.2 动态 SQL 语句. 12.1.1 Select 语句. 格式: SELECT col1, col2, … ,coln INTO :var1, :var2, … :varn FROM table_name [WHERE condition_expression] [USING transaction_object]; 其中: l col1 、 col2 等均为列名。 l table_name 为表名。 l condition_expression 为条件表达式。
E N D
第12章SQL语句 12.1 嵌入式SQL语句 12.2 动态SQL语句
12.1.1 Select语句 格式: SELECT col1, col2, …,coln INTO :var1, :var2, …:varn FROM table_name [WHERE condition_expression] [USING transaction_object]; 其中: lcol1、col2等均为列名。 ltable_name为表名。 lcondition_expression为条件表达式。 lvar1、var2等均为PowerScript中定义的变量。 ltransaction_object表示当前连接数据库的事务处理对象,默认值为SQLCA 功能:从数据库中检索第一条满足条件的记录,并将结果存放到变量var1、var2、…、varn中。
12.1.1 Select语句 例如,从表student中查找name为“李华”的记录,如果找到的话,则将其id、sex、math的值存入变量s1、s2、m1中。程序如下: string s1, x1 char s2 int m1 x1='李华' select id, sex, math into :s1, :s2, :m1 from student where name=:x1 using sqlca;//这里有一个分号 在上面的程序中,并没有用Datawindow,而是用嵌入式SQL语句从数据库中获取了所要的数据。不过,只能读取一条记录。要处理多条记录,必须用游标。
12.1.2 Insert语句 格式: INSERT [INTO] table_name [(col1, col2, …, coln)] VALUES(v1, v2, …, vn) [USING transaction_object]; 其中: lcol1、col2等均为列名。 ltable_name为表名。 lv1、v2等为PowerScript表达式。 ltransaction_object表示当前连接数据库的事务处理对象,默认值为SQLCA 功能:在表table_name中插入一条记录,各列的值依次分别为v1、v2等,若某列的列名未给,则值为NULL。 注意:如所有的列名都未给,则在Values中必须依次给出所有列的值。给出的值的类型必须与对应的列的类型相一致。
12.1.2 Insert语句 例如,在表student中插入一条记录,其列id、name、sex、math的值分别为‘99690508’、'张伟'、’f’、89,其余列的值为NULL。 程序如下: string s_id, s_name s_id=‘99690508’ s_name='张伟' insert student(id, name, sex, math) values(:s_id, :s_name, ’f’, 89); 例如,在表student中插入一条记录,其列id、name、sex、class、age、math的值分别为‘99690509’、’胡圆圆’、’m’、null、null、96、null。程序如下: Insert student values(‘99690509’, ’胡圆圆’, ’m’, null, null, 96, null) using transaction_object;
12.1.3 Update语句 格式: UPDATE table_name SET col1=v1 [,col2=v2, …, coln=vn] [WHERE condition_expression] [USING transaction_object]; 其中: lcol1、col2等均为列名。 ltable_name为表名。 lcondition_expression为条件表达式。 lv1、v2等为PowerScript表达式。 ltransaction_object表示当前连接数据库的事务处理对象,默认值为SQLCA 功能:更新表table_name中满足条件的记录,使列col1的值为v1、列col2的值为v2等。 注意:如不给出条件,则更新表中所有行。 例如,将表student中所有姓王的学生的数学成绩变为0。程序如下: int m=0 update student set math=:m where name like '王%';
12.1.4 Delete语句 格式: DELETE FROM table_name [WHERE condition_expression] [USING transaction_object]; 其中: ltable_name为表名。 lcondition_expression为条件表达式。 ltransaction_object表示当前连接数据库的事务处理对象,默认值为SQLCA。 功能:删除表table_name中满足条件的记录。 注意:如不给出条件,则删除表中所有记录。 例如:删除表student中列math的值大于30但小于60的记录。程序如下: int m1=30,m2=60 delete from student where math>:m1 and math<:m2;
12.2.1 类型一 格式: EXECUTE IMMEDIATE sqlstatement [USING transaction_object]; 其中:sqlstatement是一个内含SQL语句的字符串;transaction_object表示当前连接数据库的事务处理对象,默认值为SQLCA。 这种类型的动态SQL语句通常用于执行数据操作语句(例如定义表、删除表等)以及插入、更新和删除记录。因为没有返回值,所以不好用来查询数据(Select)。 例如,在当前数据库创建一新表teacher,有三列:列t_id为char型,宽度为10,NULL值为No;列t_name为char型,宽度是20,NULL值为Yes;列t_age为integer 型,NULL值为Yes。程序如下: string mysql mysql =“CREATE TABLE teacher”& +“(t_id char(10) not null, ”& +“t_name char(20) null, ”& +“t_age integer null) ” EXECUTE IMMEDIATE :mysql USING SQLCA;
12.2.1 类型一 例如,在表student中插入一条记录,其列id、name、math的值分别为‘99690511’、'董晓丽' 、93,其余列的值为NULL。程序如下: string mysql, s_id, s_name int m m=93 s_id=”99690511” s_name=”董晓丽” mysql=”INSERT INTO student (id,name,math) values(‘” mysql=mysql+s_id+“’, ’”+s_name+“’, ”+string(m)+”)” EXECUTE IMMEDIATE :mysql;
12.2.2 类型二 格式: Prepare DynamicStagingArea From sqlstatement [USING transaction_object]; Execute DynamicStagingArea Using [para_list]; 其中: • lsqlstatement是一个内含SQL语句的字符串,用问号(?)代表所需参数 • ltransaction_object表示当前连接数据库的事务处理对象,默认值为SQLCA • lDynamicStagingArea是PowerScript提供的一种数据类型,这种类型的变量用来存储动态SQL语句所用的信息。通常就用PowerScript预定义的全局变量SQLSA,不必另外定义。 • lpara_list是参数列表,各参数对应于sqlstatement中的问号。 这种类型的动态SQL语句通常也用于执行数据操作语句以及插入、更新和删除记录。因为没有返回值,同样不好用来查询数据(Select)。类型二与类型一的功能差不多,主要区别在于类型二可以带输入参数,因而使用起来比类型一要方便。
12.2.2 类型二 例如,在表student中插入一条记录,列id、name、math的值分别为”99690513”、”杨关”、97,其余列的值为null。程序如下: int m string s_id,s_name,sqlstr sqlstr=”INSERT INTO student(id,name,math) VALUES (?,?,?)” PREPARE SQLSA FROM :sqlstr Using SQLCA; m=97 s_id=”99690513” s_name=”杨关” EXECUTE SQLSA USING :s_id, :s_name, :math; 比较例7和例5,可以看到例7要方便一点,特别当涉及的参数及类型较多时,用类型一的方法需要较多的转换函数,字符串的构造相当复杂,而类型二的方法则简洁得多。
12.2.3 类型三 类型三有两种形式:使用游标和使用存储过程。介绍使用游标的方法。 格式: DECLARE mycursor DYNAMIC CURSOR FOR DynamicStagingArea ; PREPARE DynamicStagingArea FROM sqlstatement [USING transaction_object]; OPEN DYNAMIC mycursor [USING para_list]; FETCH mycursor |INTO var_list]; CLOSE mycursor; 其中: lmycursor是游标名。 lDynamicStagingArea这种类型的变量用来存储动态SQL语句所用的信息。通常就用PowerScript预定义的全局变量SQLSA,不必另外定义。 lsqlstatement是一个内含SQL语句的字符串,用问号(?)代表所需参数。 lpara_list是参数列表,各参数对应于sqlstatement中的问号。 lvar_list是用户在PowerScript中定义的变量,这里引用时应在变量名前加冒号 ltransaction_object表示当前连接数据库的事务处理对象,默认值为SQLCA
12.2.3 类型三 DECLARE语句说明动态游标,PREPARE准备动态SQL,OPEN打开动态游标,FETCH读取一行数据,如果需要读取多行数据,那么需要反复执行FETCH语句。最后CLOSE语句关闭动态游标。 类型三主要用于实现动态查询(Select),以弥补类型一和类型二的不足。但类型三的输入和输出参数的个数及含义在设计时必须确定。
12.2.3 类型三 例如,下面的程序统计表student中class等于“996905”的学生的math和chinese平均成绩。 Dec ave_math=0,ave_chinese=0,s_math,s_chinese Int m=0 //m表示参加统计的学生人数 String mysql,mycur,s_class s_class=”996905” mysql=”select math,chinese from student where class=?” DECLARE mycur DYNAMIC CURSOR FOR SQLSA; PREPARE SQLSA FROM :mysql USING SQLCA; OPEN DYNAMIC mycur USING :s_class; FETCH mycur INTO :s_math, :s_chinese; DO WHILE sqlca.sqlcode=0 Ave_math+=s_math Ave_chinese+=s_chinese M++ FETCH mycur INTO :s_math, :s_chinese; LOOP CLOSE mycur; Ave_math=ave_math/m Ave_chinese=ave_chinese/m ……
12.2.4 类型四 第四类动态SQL语句最复杂、功能也最强,它能够弥补类型三的不足,即输入和输出参数的个数及含义可以动态定义。同类型三一样,类型四也有两种形式:使用游标和使用存储过程。这里我们就介绍使用游标的方法,使用存储过程与此类似。 格式: DECLARE cursor DYNAMIC CURSOR FOR DynamicStagingArea; PREPARE DynamicStagingArea FROM sqlstatement[USING transaction_object]; DESCRIBE DynamicStagingArea INTO DynamicDescriptionArea; OPEN DYNAMIC cursor [USING DESCRIPTOR DynamicDescriptionArea] FETCH cursor USING DESCRIPTOR DynamicDescriptionArea; CLOSE cursor;
12.2.4 类型四 其中: lcursor是游标名 lDynamicStagingArea这种类型的变量用来存储动态SQL语句所用的信息。通常就用PowerScript预定义的全局变量SQLSA,不必另外定义。 lsqlstatement是一个内含SQL语句的字符串,用问号(?)代表所需参数 lDynamicDescriptionArea也是PowerScript提供的一种数据类型,这种类型的变量用来存储类型四的动态SQL语句所用的输入和输出参数信息。通常就用PowerScript预定义的全局变量SQLDA,不必另外定义。 ltransaction_object表示当前连接数据库的事务处理对象,默认值为SQLCA 类型四主要用于实现动态查询(Select),以弥补类型三的不足。但类型四的输入和输出参数要通过SQLDA的相应函数和属性来处理。
12.2.4 类型四 SQLDA的四个常用属性: (1) NumInputs:输入参数个数 (2) InParmType:输入参数类型,是个数组,每个元素依次对应于SQL语句中的一个问号的类型。设置输入参数的值用函数SetDynamicParm()。 (3) NumOutputs:输出参数个数 (4) OutParmType:输出参数类型,是个数组,每个元素依次对应于一个输出参数的类型。读取输出参数的值用函数GetDynamicString()等。 InParmType和OutParmType的值均为枚举类型。 SQLDA的几个常用函数: (1) GetDynamicNumber(n):读取第n个输出参数的值,其类型为数值型 (2) GetDynamicString(n):读取第n个输出参数的值,其类型为字符型 (3) GetDynamicDate(n):读取第n个输出参数的值,其类型为Date型 (4) GetDynamicTime(n):读取第n个输出参数的值,其类型为Time型 (5) GetDynamicDateTime(n):读取第n个输出参数的值,其类型为DateTime型 (6) SetDynamicParm ( n, value ):将值value传给第n个输入参数
图12-1动态SQL语句例题 12.2.4 类型四 下面通过例题来说明类型四的用法。 例如,由用户输入查询语句,通过类型四的方法,得到查询结果。图中提供了一个多行编辑框mle_1供用户输入查询语句,查询的结果显示在列表框lb_1中。由于用户输入的查询语句,其表名、列名、条件都是动态的,用其它方法很难实现。
12.2.4 类型四 命令按钮的程序为: int m,n string mysql,str mysql=mle_1.text //读取查询语句 lb_1.reset() //重置lb_1 DECLARE mycur DYNAMIC CURSOR FOR sqlsa; PREPARE sqlsa FROM :mysql USING sqlca; DESCRIBE sqlsa INTO sqlda; OPEN DYNAMIC mycur USING DESCRIPTOR sqlda; FETCH mycur USING DESCRIPTOR sqlda; m=sqlda.numoutputs //获取输出参数的个数,即Select中列的个数
12.2.4 类型四 DO WHILE sqlca.sqlcode=0 //测试查询是否成功 str="" //将查询结果变为一个串 FOR n=1 to m //处理所有的输出参数 CHOOSE case sqlda.outparmtype[n] //判断每个输出参数的类型 CASE typeinteger!,typedecimal! , TypeDouble! //输出参数为Integer、decimal、Double型 str=str+string(sqlda.getdynamicnumber(n))+”“ CASE typestring! //输出参数为string型 str=str+trim(sqlda.getdynamicstring(n))+”“ CASE typedate! //输出参数为Date型 str=str+string(sqlda.getdynamicdate(n))+ “” END CHOOSE NEXT lb_1.additem(str) //显示查询结果 FETCH mycur USING DESCRIPTOR sqlda; //处理下一条记录 LOOP CLOSE mycur;//关闭游标