嵌入式的SQL程序设计

嵌入式的SQL程序设计

  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语句设置当提交或回滚事务时自动关闭当前连接的所有打开的游标

 

嵌入式SQL编程的范例,使用VC6编译Oracle 10g 嵌入式SQL程序操作步骤 一、 基本要求 1、所需软件Visual C++ 6.0 2、 源代码包括 PRO C 文件: student.pc 3、安装ORACLE10G 或其客户端 在ORACLE10G CLIENT 安装时并没有 Precomp C 的选项,可以选择全部安装或者开发人员选项进行安装。安装后确保有如下几个文件: PROC的可执行文件 : $ORACLE_HOME\BIN\PROC.EXE Oracle支持SQL在VC环境的库文件OraSQL10.LIB Oracle支持SQL在VC环境的头文件 : 位于$ORACLE_HOME\precomp\ PUBLIC \*.h 文件 二、 将PROC集成到VC环境中 1、增加PROC到Tools(工具)菜单列表 在本例中,$ORACLE_HOME指的是E:\oracle\product\10.1.0\db_1目录。   a) 运行Microsoft Visual C++ 6.0;   b) 从菜单项Tools(工具)中选择Customize(定制)项。为表述简单起见,书写成如下格式:菜单Tools/ Customize(工具/定制) 项。以下采用似的表达方法。此时出现Customize(定制)对话框;   c) 单击Tools(工具)选项卡(或属性页),用鼠标移动“Menu contents(菜单目录)”框滚动条到底部区域;   d) 双击点划线矩形区域,在空白区域上输入“PROC”,然后按回车键;   e) 在“Command(命令)”框中,输入PROC的可执行文件名。例如:E:\oracle\product\10.1.0\db_1\BIN\ PROC. EXE  f) 在“Arguments(参数)”框中输入“$(TargetName)”。其作用在从菜单Tools中选择PROC项时,VC会将当前项目名传递给PROC,尔后PROC会直接打开该项目文件目录下扩展名为 .pre的同名文件; g) 在“Initial directory(初始化目录)”框中输入“$(WkspDir)” / 单击“Close(关闭)”按钮,完成将PROC集成到VC环境中的工作。 2、指定头文件路径   为了确保VC顺利完成编译链接,需要将Oracle提供的头文件增加到VC环境中。指定头文件路径的具体步骤如下。   a) 菜单Tools / Options(工具/选择)项,出现“Options(选择)”对话框;   b) 单击“Directories(目录)”选项卡,从“Show directories for(显示目录为):”列表框中选择“Include files”;   c) 移动“Directories(路径)”框的滚动条到底部区域; d) 双击点划线矩形区域,在空白区域上输入包含Oracle支持SQL在VC环境头文件的子目录,对缺省安装即输入E:\oracle\product\10.1.0\db_1\ PRECOMP \ PUBLIC。 e) 单击“Directories(目录)”选项卡,从“Show directories for(显示目录为):”列表框中选择“Library files”;   f) 移动“Directories(路径)”框的滚动条到底部区域; d) 双击点划线矩形区域,在空白区域上输入包含Oracle支持SQL在VC环境头文件的子目录,对缺省安装即输入E:\oracle\product\10.1.0\db_1\ PRECOMP \ lib\msvc。 3、可执行文件路径 a) 菜单Tools / Options(工具/选择)项,出现“Options(选择)”对话框; b) 单击“Directories(目录)”选项卡,从“Show directories for(显示目录为):”列表框中选择“Executable files”; c) 查看“Directories(路径)”框是否包括$ORACLE_HOME\BIN 路径,一般先安装ORACLE再安装VC,这个路径会包括在内的,如果没有包括,添加这么一条路径。 三、 程序创建过程 1、 创建新工程 当运行Visual C++ 6.0后,操作步骤如下:   a) 菜单File / New项 / Project卡;   b) 选择Win32 console Application 项;   c) 由浏览选择或直接输入工程将位于的路径 / 填入创建的工程名如student 。 d) 单击OK按钮 / 依缺省值单击Finish / 单击OK,完成创建控制台应用工程框架。 e) 菜单工程/设置 项/link卡, 添加两个文件 oraSQL10.lib, oraSQX10.lib 到对象/库模块中 2、将PRO C 文件加入工程  a) 菜单Project / Add To Project 项 / Files 项;   b) 将文件对话框的文件型改为“所有文件”;   c) 路径选为student.pc 文件所在目录   d) 选择student.pc文件,单击“打开”钮,完成将PRO C文件加入工程。 3、预编译  通过预编译,将预编译源文件如student.pc转换成为student.c的C程序源文件。在PROC集成到VC环境下时操作步骤如下:   a) 菜单Tools / PROC 项; b)此时弹出PROC预编译命令行窗口,从窗口标题可以看成,其执行E:\oracle\product\10.1.0\db_1\BIN\ PROC. EXE student 当窗口提示:“press any key to continue” ,敲任意键该窗口关闭。 此时可以看到生成student.c 文件 c) 如果预编译结束,预编译对话框左边显示的状态图标为黄色(警告)或红色(预编译失败)时,应双击该标识观察帮助或出错信息。预编译失败,应当修改源程序,再进行预编译,直到通过预编译。 4、编译准备   为了使工程能通过编译,需要将预编译输出的工程源文件和Oracle支持SQL在VC环境下的运行库文件加入到工程中,下面具体介绍增加这两个文件的步骤。   1) 将预编译的输出文件和有关头文件加入工程   a) 菜单Project / Add To Project 项 / Files 项;   b) 在文件对话框中选择正确路径,选定预编译输出生成的文件student.c,单击“打开”按钮,即将这些文件加入工程。   2) 将运行库文件加入工程   a) 菜单Project / Add To Project 项 / Files 项;   b) 将文件对话框的文件型改为“所有文件”;   c) 路径选为$ORACLE_HOME\precomp\LIB   d) 选择OraSQL10.LIB文件,单击“打开”钮,完成将运行库文件加入工程。 5、编译链接   按F7键或单击编译图标,对工程进行编译链接。如果没有出现错误,则通过编译链接,生成可执行文件如student.exe。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值