嵌入式的SQL程序设计

浏览: 1675
  1 --嵌入式SQL程序设计
2 --SQL2005管理员大全
3
4
5 --嵌入SQL语句的应用程序叫做宿主程序,书写该程序的语言称为宿主语言。
6 --宿主语言可以是C、C++、JAVA等。嵌入的SQL语句与交互式SQL在语法上类似
7 --但是嵌入式SQL在个别语句上有所扩充
8
9 --嵌入的SQL语句主要有两种类型:执行性SQL语句和说明性SQL语句。执行性SQL语句可用来
10 --定义数据、查询和操纵数据库中的数据,每一执行性语句真正对数据库进行操作。说明性语句
11 --用来说明通信域和SQL语句中用到的变量。说明性语句不生成执行代码
12
13 --在C语言中使用嵌入式SQL
14 --SQLSERVER提供对C的嵌入式语言的支持,在用于C语言的嵌入式SQL(以下简称ESQL/C)
15 --大部分语法都来源于TSQL语法,只是在某些细节上略有不同。
16
17 --在ESQL/C中,关键字和SQL语句都是不区分大小写的,但是对于游标、连接和动态SQL语句
18 --的定义却是区分大小写的,例如,以下定义的两个游标是完全不同的
19
20 DECLARE RED_CURSOR CURSOR
21 DECLARE red_CURSOR CURSOR
22
23 --1、连接到SQLSERVER
24 --在ESQL/C中,连接到SQLSERVER用connect to语句,语法如下:
25 CONNECT TO servername.databasename AS connection_name USER LOGIN.PASSWORD
26
27 --当只有一个连接时,可以不指定连接的名称,但是如果应用程序使用了两个或以上的连接
28 --,必须为每个连接指定不同的名称。当用connect to定义了连接后,所有的后续操作都将
29 --在当前连接上进行,如果想使用另外一个连接,就要用SET CONNECTION来改变当前的连接,语法如下:
30 SET CONNECTION connection_name
31
32 --关闭与数据的连接用DISCONNECT,可以关闭当前连接或关闭所有连接,语法如下
33 DISCONNECT connection_name | ALL | CURRENT
34
35 --例子:连接机器red上数据库名为book和test的SQLSERVER数据库,数据库用户名为sa
36 --密码为空,然后分别关闭他们
37 EXEC SQL CONNECT TO red.book AS con1 USER sa;
38 EXEC SQL CONNECT TO red.test AS con2 USER sa;
39 EXEC SQL DISCONNECT CON1
40 EXEC SQL DISCONNECT CON2
41
42
43 --2、使用宿主变量
44 --宿主变量作为标准的C变量在ESQL/C中定义,使用宿主变量可以在SQL语句中指定输入参数或接收输出参数
45 --定义宿主变量的语句写在BEGIN DECLARE SECTION和END DECLARE SECTION语句之间
46 EXEC SQL BEGIN DECLARE SECTION
47 INT CompanyID
48 CHAR CompanyName[30]
49 EXEC SQL END DECLARE SECTION
50
51 --使用宿主变量时,要在宿主变量前加一个冒号作为引用宿主变量的标志
52 "WHERE CompanyID=:CompanID"
53
54 --注意:如果从数据库中传给宿主变量的值是NULL,那么宿主变量将会把NULL值转换为-1处理,例如:虽然给
55 --宿主变量Address赋予了NULL值,以下SQL语句还是不会返回Address为NULL值的记录
56
57 EXEC SQL SELECT FROM Company
58 WHERE Address=:ADDRESS
59
60 --3、使用SQL语句
61 --在ESQL/C中有两种SQL语句,一种是静态SQL语句,另一种是动态SQL语句,静态SQL语句是一个完整的SQL语句
62 --而动态SQL语句需要在运行时指定条件变量
63
64 --可以用PREPARE来定义一个动态SQL语句,语法如下:
65 PREPARE stmt_name FROM :hvar
66
67 --执行一个动态SQL语句可以用EXECUTE或EXECUTE IMMEDIATE,EXECUTE IMMEDIATE指的是
68 --执行一个包含宿主变量中的SQL语句
69
70 --可以用SELECT INTO L来把查询结果赋予指定的宿主变量,只用于返回一条记录的查询语句,如果查询
71 --语句返回多行记录,可以使用游标来处理
72
73 --例子:构造一个动态SQL语句,插入一条记录到COMPANY表
74 EXEC SQL BEGIN DECLARE SECTION
75 CHAR stmtcon[]="insert into company values(?,?)"
76 CHAR companyid[30]
77 CHAR companyname[30]
78 EXEC SQL END DECLARE SECTION
79 //提示用户输入数据//
80 PRINTF("输入单位代码:")
81 SCANF("%S",COMPANYID)
82 PRINTF("输入单位名称:")
83 scanf("%s",companyname)
84 EXEC SQL PREPARE stmt FROM :stmtcon
85 EXEC SQL EXECUTE stmt USING:COMPANYID,:COMPANYNAME
86
87 --例子:把单位代码为"0001"的单位名称赋予给变量companname
88 EXEC SQL BEGIN DECLARE SECTION
89 CHAR COMPANYNAME[30]
90 EXEC SQL END DECLARE SECTION
91 EXEC SQL SELECT COMPANYNAME INTO :COMPANYNAME
92 FROM COMPANY WHERE COMPANYID='0001'
93
94 --使用游标
95 --当SQL查询语句只返回一行时,可以用SELECT INTO 语句把返回值赋予给宿主变量
96 --但是当查询语句返回多行时,就不能用SELECT INTO,此时就需要游标来处理
97
98 --游标分为静态游标和动态游标,静态游标包含完整的SQL语句,动态游标则需要在运行时指定参数
99 --静态游标可以包含宿主变量,当打开他时,宿主变量就被读到SQL语句中,形成一个完整的SQL语句
100 --动态游标中的参数用?标记符来指定,当打开游标时,根据提供的?标记符代码的数据来构造
101 --SQL语句
102
103 --在使用游标之前必须要定义游标,定义游标语法如下
104 DECLARE cursor_name INSENSITIVE SCROLL CURSOR FOR select_stmt
105 prepare_stmt_name FOR READ_ONLY | UPDATE |OF column_list
106
107 --打开游标使用open语句,用fetch语句移动打开的记录集。对于打开的游标,可以用
108 --update来更新数据,delete来删除数据。游标使用完后,用close语句来关闭他
109
110 --例子:定义一个游标,返回单位信息表的所有记录,并输出单位信息到屏幕上
111 //定义游标,并打开//
112 EXEC SQL DECLARE C1 CURSOR FOR
113 SELECT COMPANYID,COMPANYNAME FROM COMPANY FOR BROWSE
114 EXEC SQL OPEN C1
115 //定义变量//
116 EXEC SQL BEGIN DECLARE SECTION
117 CHAR COMPANYID[30]
118 CHAR COMPANYNAME[30]
119 EXEC SQL END DECLARE SECTION
120 //输出信息//
121 WHILE (SQLCODE==0)
122 {
123 EXEC SQL FETCH C1 INTO :COMPANYID,:COMPANYNAME
124 PRINTF("%S,%S",COMPANYID,COMPANYNAME)
125 }
126
127 --例子:定义一个动态游标,查询单位名称为“北京怡神公司”的单位,返回其代码
128 EXEC SQL BEGIN DECLARE SECTION
129 CHAR SZCOMMAND[]="SELECT COMPANYID FROM COMPANY WHERE COMPANYNAME=?";
130 CHAR SZCOMPANYNAME[]="北京怡神公司";
131 CHAR SZCOMPANYID[30]
132 EXEC SQL END DECLARE SECTION
133 //定义动态游标//
134
135 EXEC SQL
136 DECLARE CON_CURSOR CURSOR FOR SELECT_STATEMENT;
137 //准备SQL语句//
138 EXEC SQL
139 PREPARE SELECT_STATEMENT FROM :SZCOMMAND
140 //打开游标,输出到变量中//
141 EXEC SQL OPEN CON_CURSOR USING:SZCOMPANYNAME;
142 EXEC SQL FETCH CON_CURSOR INTO:SZCOMPANYID;
143
144 --5、使用事务
145 --ESQL/C像TSQL一样完全支持事务管理,打开一个事务用BEGIN TRANSACTION
146 --提交事务用COMMIT TRANSACTION,回滚事务用ROLLBACK TRANSACTION
147 --事务操作只对当前连接有效
148
149 --注意:当提交或回滚事务时,ESQL/C并不自动关闭打开的游标,可以使用
150 --SET CURSOR_CLOSE_ON_COMMIT语句设置当提交或回滚事务时自动关闭当前连接的所有打开的游标

 

推荐 0
本文由 桦仔 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册