1 / 20

第 12 章 SQL 语句

第 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 为条件表达式。

gitel
Download Presentation

第 12 章 SQL 语句

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第12章SQL语句 12.1 嵌入式SQL语句 12.2 动态SQL语句

  2. 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中。

  3. 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语句从数据库中获取了所要的数据。不过,只能读取一条记录。要处理多条记录,必须用游标。

  4. 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中必须依次给出所有列的值。给出的值的类型必须与对应的列的类型相一致。

  5. 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;

  6. 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 '王%';

  7. 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;

  8. 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;

  9. 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;

  10. 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)。类型二与类型一的功能差不多,主要区别在于类型二可以带输入参数,因而使用起来比类型一要方便。

  11. 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. 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

  13. 12.2.3 类型三 DECLARE语句说明动态游标,PREPARE准备动态SQL,OPEN打开动态游标,FETCH读取一行数据,如果需要读取多行数据,那么需要反复执行FETCH语句。最后CLOSE语句关闭动态游标。 类型三主要用于实现动态查询(Select),以弥补类型一和类型二的不足。但类型三的输入和输出参数的个数及含义在设计时必须确定。

  14. 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 ……

  15. 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;

  16. 12.2.4 类型四 其中: lcursor是游标名 lDynamicStagingArea这种类型的变量用来存储动态SQL语句所用的信息。通常就用PowerScript预定义的全局变量SQLSA,不必另外定义。 lsqlstatement是一个内含SQL语句的字符串,用问号(?)代表所需参数 lDynamicDescriptionArea也是PowerScript提供的一种数据类型,这种类型的变量用来存储类型四的动态SQL语句所用的输入和输出参数信息。通常就用PowerScript预定义的全局变量SQLDA,不必另外定义。 ltransaction_object表示当前连接数据库的事务处理对象,默认值为SQLCA 类型四主要用于实现动态查询(Select),以弥补类型三的不足。但类型四的输入和输出参数要通过SQLDA的相应函数和属性来处理。

  17. 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个输入参数

  18. 图12-1动态SQL语句例题 12.2.4 类型四 下面通过例题来说明类型四的用法。 例如,由用户输入查询语句,通过类型四的方法,得到查询结果。图中提供了一个多行编辑框mle_1供用户输入查询语句,查询的结果显示在列表框lb_1中。由于用户输入的查询语句,其表名、列名、条件都是动态的,用其它方法很难实现。

  19. 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中列的个数

  20. 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;//关闭游标

More Related