190 likes | 340 Views
数据库系统概论 An Introduction to Database System 第八章 数据库编程. 8.1 嵌入式 SQL. SQL 语句除了象前面介绍的可以交互的方式使用的外,更常用的方式是用某种传统的编程语言(例如: C 、 PB 、 COBOL 等)编写程序,但程序中的某些函数或某些语句是 SQL 语句。这种方式下使用的 SQL 语言称为嵌入式 SQL ( EmbeddedSQL ),其中传统的编程语言称为宿主语言(或主语言)。. 8.1.1 嵌入式 SQL 的一般形式.
E N D
数据库系统概论 An Introduction to Database System 第八章 数据库编程 An Introduction to Database System
8.1嵌入式SQL • SQL语句除了象前面介绍的可以交互的方式使用的外,更常用的方式是用某种传统的编程语言(例如:C、PB、COBOL等)编写程序,但程序中的某些函数或某些语句是SQL语句。这种方式下使用的SQL语言称为嵌入式SQL(EmbeddedSQL),其中传统的编程语言称为宿主语言(或主语言)。 An Introduction to Database System
8.1.1嵌入式SQL的一般形式 • 对嵌入到高级语言中的SQL语句,必需能够与宿主语言语句区分开来,例如Power Builder中采用的区分方式是在SQL语句后加上分号“;”。 • 而大多数的宿主语言在SQL前加上EXEC SQL标记,而结束标记各有不同。 • 在识别出嵌入式SQL后,DBMS可以采用两种方法处理嵌入式SQL语言: • 预编译 • 扩充编译程序法。 An Introduction to Database System
主语言程序 含ESQL语句 RDBMS的 预处理程序 ESQL语句转换 为函数调用 主语言 编译程序 目标语言程序 ESQL基本处理过程 嵌入式SQL的处理过程 An Introduction to Database System
8.1.2 嵌入式SQL与主语言之间的通信 • SQL为面向集合的语句,而主语言为面向过程的语句,必需解决好二者的通信问题。 An Introduction to Database System
一、SQL通信区 • 在主变量中,有一个系统定义的主变量,叫SQLCA(SQL Communication Area:SQL通信区)。SQLCA是一全局变量,供应用程序和DBMS通信之用。SQLCA变量不需加以说明,在Power Builder中可以直接使用。 • 例如SQLCA对象的SQLCODE的值可以返回SQL语句是否执行成功,而SQLErrText可以返回出错的原因。 An Introduction to Database System
二、主变量 • 在DBMS和宿主语言程序之间的数据传递,是通过宿主语言程序变量,简称主变量来实现的。 • 当SQL语句引用主变量时,变量前应加冒号“:”,以区别于数据库对象名(如:列名、表名、视图名等),因此主变量可与数据库变量同名。在宿主语言中引用主变量时,不须加冒号。通过主变量,宿主语言可向SQL语句提供参数,如指定向数据库中插入(或修改)的数据; An Introduction to Database System
另外,SQL语句可对主变量赋值或设置状态信息,返回给应用程序,使应用程序得到SQL语句的结果和状态。另外,SQL语句可对主变量赋值或设置状态信息,返回给应用程序,使应用程序得到SQL语句的结果和状态。 • 在嵌入式程序中,所有的主变量,除系统定义的外,都必须加以说明,说明放在两个嵌入式SQL语句之间: • EXEC SQL BEGIN DECLARE SECTION; • … • EXEC SQL END DECLARE SECTION; 提示: Power Builder定义方法与普通变量一样,无需放在上述结构中。 An Introduction to Database System
三、游标 • SQL语言和宿主语言的不同数据处理方式,是通过游标(Cursor)来协调的。游标是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果。每个游标都有一个名字。用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,由宿主语言作进一步的处理。 • 游标的操作包括四个步骤: An Introduction to Database System
1. 说明游标 • 格式: • EXEC SQL DECLARE 游标名CURSOR • FOR<SELECT语句>; • 其中的SELECT语句,既可以是简单查询,也可以是连接查询或嵌套查询,它的结果集是一个新的关系。 • 说明游标仅仅是一条说明性语句,此时DBMS并不执行SELECT指定的查询操作。 An Introduction to Database System
2.打开游标 • 格式: • EXEC SQL OPEN<游标名>; • 打开游标,将执行相应的SELECT语句,把满足查询条件的所有记录,从表中取到缓冲区中。此时游标被激活,指针指向结果集中的第一条记录。 An Introduction to Database System
3.推进游标指针并取当前记录 • 使用FETCH语句,将缓冲区中的当前记录取出送至主变量供宿主语言进一步处理。同时,把游标指针向前推进一条记录。 • 格式: • EXEC SQL FETCH<游标名>INTO<主变量名列表>; • 主变量名列表由逗号分开,并与SELECT语句中的目标列表达式必须一一对应。 An Introduction to Database System
4.关闭游标 • 用CLOSE语句关闭游标,释放结果集占用的缓冲区及其他资源。但是,被关闭的游标可以用OPEN语句重新初始化,与新的查询结果相联系。 • 格式: • EXEC SQL CLOSE<游标名>; An Introduction to Database System
…. • EXEC SQL INCLUDE SQLCA; ……… ( 1) 定义SQLCA • EXEC SQL BEGIN DECLARE SECTION; (2) 开始定义主变量 • CHAR Sno(5): CHAR Cno(3): INT Grade; • EXEC SQL END DECLARE SECTION;….. 主变量定义结束 • main () { • EXEC SQL DECLARE CURSOR C1 FOR ….(3) 定义游标 • SELECT Sno,Cno,Grade FROM SC; • EXEC SQL OPEN C1;…………………….(4) 打开游标 An Introduction to Database System
for(;;) { • EXEC SQL FECH C1 INTO :Sno, :Cno,:Grade;……(5) 推进游标 • If (sqlca.sqlcode<>SUCCESS) break; • Printf( “Sno:%s,Cno:%s,Grade:%d”,Sno,Cno,Grade); • } • EXEC SQL CLOSE C1; ……..(6) 关闭游标 • } An Introduction to Database System
PB中游标实例 • string sdept,sno,sname,ssex • int sage • sdept=sle_1.text • Declare stu_cursor cursor for • select sno,sname,ssex,sage • from student • where sdept=:sdept; • Open stu_cursor; An Introduction to Database System
PB中游标实例(续) • Fetch stu_cursor into :sno,:sname,:ssex,:sage; • Do while sqlca.sqlcode =0 • MessageBox(‘tip’,”Sno:”+sno+”sname:”+sname+”ssex:”+ssex+”sage:”+sage) • Fetch stu_cursor into :sno,:sname,:ssex,:sage; • Loop • Close stu_cursor; An Introduction to Database System
C#中使用嵌入式SQL的例子 • String ConnString = System.Configuration.ConfigurationManager.ConnectionStrings["bysjConnectionString"].ConnectionString; • SqlConnection Conn = new SqlConnection(ConnString); • Conn.Open(); • String profession = Session["profession"].ToString(); • String technical = technicalList.SelectedValue; • String teacher_name = tname.Text.Trim(); • String institute = instituteTextBox.Text.Trim(); • String strSQL = "insert teacher_login(teacher_name,institute,profession,technical) values('"; • strSQL += teacher_name + "','" + institute + "'," + profession + ",'" + technical + "')"; An Introduction to Database System
Response.Write(strSQL); • try • { • SqlCommand Comm = new SqlCommand(strSQL, Conn); • Comm.ExecuteNonQuery(); • } • catch (Exception error) • { • Response.Write(error.ToString()); • } • finally • { • Conn.Close(); • } An Introduction to Database System