嵌入式的SQL程序设计

  • sql语句大全之嵌入式SQL

  • 2017-01-18 16:00 来源:未知
  •  

嵌入式SQL

为了更好的理解嵌入式SQL,本节利用一个具体例子来说明。嵌入式SQL允许程序连接数据库并且包括SQL代码到程序中,这样在程序中就可以对数据库进行使用、操作以及处理数据等等。以下是用C语言编写的使用嵌入SQL的例程,它将打印一个报告;这个程序必须在普通的编译之前先预编译SQL语句。嵌入SQL对于不同系统是不一样的,所以在不同的系统中对以下的程序稍作修改,特别是变量的声明以及过程记录等。在嵌入SQL时,考虑网络、数据库管理系统、操作系统是相当重要的。
以下是详细的代码:
#include <stdio.h>
/* 以下这部分是声明主机变量,它将使用于程序中*/
EXEC SQL BEGIN DECLARE SECTION;
int BuyerID;
char FirstName[100], LastName[100], Item[100];
EXEC SQL END DECLARE SECTION;
/* 以下包括SQLCA变量,它可以用来进行错误检查 */
EXEC SQL INCLUDE SQLCA;
main()
{
/* 以下连接数据库*/
EXEC SQL CONNECT UserID/Password;
/* 以下是连接数据库并检查是否有错误产生T */ 
if(sqlca.sqlcode) 
{
printf(Printer, "Error connecting to database server.\n");
exit();
}
printf("Connected to database server.\n");
/* 下面声明一个 "Cursor"。它将在查询结果多于一行的时候使用*/
EXEC SQL DECLARE ItemCursor CURSOR FOR
SELECT ITEM, BUYERID
FROM ANTIQUES
ORDER BY ITEM;
EXEC SQL OPEN ItemCursor;
/* 你可以在这里还可以加入另外一些错误检查的内容,这里就省略了*/
/* 当这个CURSOR没有数据, sqlcode将被产生以允许我们退出循环。这里注意,为了简单起见,我们使程序遇到错误的时候就退出任何的sqlcode。*/
EXEC SQL FETCH ItemCursor INTO :Item, :BuyerID;
while(!sqlca.sqlcode) 
{
EXEC SQL UPDATE ANTIQUES
SET PRICE = PRICE + 5
WHERE ITEM = :Item AND BUYERID = :BuyerID;
EXEC SQL SELECT OWNERFIRSTNAME, OWNERLASTNAME
INTO :FirstName, :LastName
FROM ANTIQUEOWNERS
WHERE BUYERID = :BuyerID;
printf("%25s %25s %25s", FirstName, LastName, Item);
EXEC SQL FETCH ItemCursor INTO :Item, :BuyerID;
}
/* 关闭CURSOR,提交变化并退出程序。*/
EXEC SQL CLOSE DataCursor;
EXEC SQL COMMIT RELEASE;
exit();
}
 

--嵌入式SQL程序设计
--SQL2005管理员大全 --嵌入SQL语句的应用程序叫做宿主程序,书写该程序的语言称为宿主语言。
--宿主语言可以是C、C++、JAVA等。嵌入的SQL语句与交互式SQL在语法上类似
--但是嵌入式SQL在个别语句上有所扩充 --嵌入的SQL语句主要有两种类型:执行性SQL语句和说明性SQL语句。执行性SQL语句可用来
--定义数据、查询和操纵数据库中的数据,每一执行性语句真正对数据库进行操作。说明性语句
--用来说明通信域和SQL语句中用到的变量。说明性语句不生成执行代码 --在C语言中使用嵌入式SQL
--SQLSERVER提供对C的嵌入式语言的支持,在用于C语言的嵌入式SQL(以下简称ESQL/C)
--大部分语法都来源于TSQL语法,只是在某些细节上略有不同。 --在ESQL/C中,关键字和SQL语句都是不区分大小写的,但是对于游标、连接和动态SQL语句
--的定义却是区分大小写的,例如,以下定义的两个游标是完全不同的 DECLARE RED_CURSOR CURSOR
DECLARE red_CURSOR CURSOR --1、连接到SQLSERVER
--在ESQL/C中,连接到SQLSERVER用connect to语句,语法如下:
CONNECT TO servername.databasename AS connection_name USER LOGIN.PASSWORD --当只有一个连接时,可以不指定连接的名称,但是如果应用程序使用了两个或以上的连接
--,必须为每个连接指定不同的名称。当用connect to定义了连接后,所有的后续操作都将
--在当前连接上进行,如果想使用另外一个连接,就要用SET CONNECTION来改变当前的连接,语法如下:
SET CONNECTION connection_name --关闭与数据的连接用DISCONNECT,可以关闭当前连接或关闭所有连接,语法如下
DISCONNECT connection_name | ALL | CURRENT --例子:连接机器red上数据库名为book和test的SQLSERVER数据库,数据库用户名为sa
--密码为空,然后分别关闭他们
EXEC SQL CONNECT TO red.book AS con1 USER sa;
EXEC SQL CONNECT TO red.test AS con2 USER sa;
EXEC SQL DISCONNECT CON1
EXEC SQL DISCONNECT CON2 --2、使用宿主变量
--宿主变量作为标准的C变量在ESQL/C中定义,使用宿主变量可以在SQL语句中指定输入参数或接收输出参数
--定义宿主变量的语句写在BEGIN DECLARE SECTION和END DECLARE SECTION语句之间
EXEC SQL BEGIN DECLARE SECTION
INT CompanyID
CHAR CompanyName[]
EXEC SQL END DECLARE SECTION --使用宿主变量时,要在宿主变量前加一个冒号作为引用宿主变量的标志
"WHERE CompanyID=:CompanID" --注意:如果从数据库中传给宿主变量的值是NULL,那么宿主变量将会把NULL值转换为-1处理,例如:虽然给
--宿主变量Address赋予了NULL值,以下SQL语句还是不会返回Address为NULL值的记录 EXEC SQL SELECT FROM Company
WHERE Address=:ADDRESS --3、使用SQL语句
--在ESQL/C中有两种SQL语句,一种是静态SQL语句,另一种是动态SQL语句,静态SQL语句是一个完整的SQL语句
--而动态SQL语句需要在运行时指定条件变量 --可以用PREPARE来定义一个动态SQL语句,语法如下:
PREPARE stmt_name FROM :hvar --执行一个动态SQL语句可以用EXECUTE或EXECUTE IMMEDIATE,EXECUTE IMMEDIATE指的是
--执行一个包含宿主变量中的SQL语句 --可以用SELECT INTO L来把查询结果赋予指定的宿主变量,只用于返回一条记录的查询语句,如果查询
--语句返回多行记录,可以使用游标来处理 --例子:构造一个动态SQL语句,插入一条记录到COMPANY表
EXEC SQL BEGIN DECLARE SECTION
CHAR stmtcon[]="insert into company values(?,?)"
CHAR companyid[]
CHAR companyname[]
EXEC SQL END DECLARE SECTION
//提示用户输入数据//
PRINTF("输入单位代码:")
SCANF("%S",COMPANYID)
PRINTF("输入单位名称:")
scanf("%s",companyname)
EXEC SQL PREPARE stmt FROM :stmtcon
EXEC SQL EXECUTE stmt USING:COMPANYID,:COMPANYNAME --例子:把单位代码为"0001"的单位名称赋予给变量companname
EXEC SQL BEGIN DECLARE SECTION
CHAR COMPANYNAME[]
EXEC SQL END DECLARE SECTION
EXEC SQL SELECT COMPANYNAME INTO :COMPANYNAME
FROM COMPANY WHERE COMPANYID='' --使用游标
--当SQL查询语句只返回一行时,可以用SELECT INTO 语句把返回值赋予给宿主变量
--但是当查询语句返回多行时,就不能用SELECT INTO,此时就需要游标来处理 --游标分为静态游标和动态游标,静态游标包含完整的SQL语句,动态游标则需要在运行时指定参数
--静态游标可以包含宿主变量,当打开他时,宿主变量就被读到SQL语句中,形成一个完整的SQL语句
--动态游标中的参数用?标记符来指定,当打开游标时,根据提供的?标记符代码的数据来构造
--SQL语句 --在使用游标之前必须要定义游标,定义游标语法如下
DECLARE cursor_name INSENSITIVE SCROLL CURSOR FOR select_stmt
prepare_stmt_name FOR READ_ONLY | UPDATE |OF column_list --打开游标使用open语句,用fetch语句移动打开的记录集。对于打开的游标,可以用
--update来更新数据,delete来删除数据。游标使用完后,用close语句来关闭他 --例子:定义一个游标,返回单位信息表的所有记录,并输出单位信息到屏幕上
//定义游标,并打开//
EXEC SQL DECLARE C1 CURSOR FOR
SELECT COMPANYID,COMPANYNAME FROM COMPANY FOR BROWSE
EXEC SQL OPEN C1
//定义变量//
EXEC SQL BEGIN DECLARE SECTION
CHAR COMPANYID[]
CHAR COMPANYNAME[]
EXEC SQL END DECLARE SECTION
//输出信息//
WHILE (SQLCODE==)
{
EXEC SQL FETCH C1 INTO :COMPANYID,:COMPANYNAME
PRINTF("%S,%S",COMPANYID,COMPANYNAME)
} --例子:定义一个动态游标,查询单位名称为“北京怡神公司”的单位,返回其代码
EXEC SQL BEGIN DECLARE SECTION
CHAR SZCOMMAND[]="SELECT COMPANYID FROM COMPANY WHERE COMPANYNAME=?";
CHAR SZCOMPANYNAME[]="北京怡神公司";
CHAR SZCOMPANYID[];
EXEC SQL END DECLARE SECTION
//定义动态游标// EXEC SQL
DECLARE CON_CURSOR CURSOR FOR SELECT_STATEMENT;
//准备SQL语句//
EXEC SQL
PREPARE SELECT_STATEMENT FROM :SZCOMMAND
//打开游标,输出到变量中//
EXEC SQL OPEN CON_CURSOR USING:SZCOMPANYNAME;
EXEC SQL FETCH CON_CURSOR INTO:SZCOMPANYID; --5、使用事务
--ESQL/C像TSQL一样完全支持事务管理,打开一个事务用BEGIN TRANSACTION
--提交事务用COMMIT TRANSACTION,回滚事务用ROLLBACK TRANSACTION
--事务操作只对当前连接有效 --注意:当提交或回滚事务时,ESQL/C并不自动关闭打开的游标,可以使用
--SET CURSOR_CLOSE_ON_COMMIT语句设置当提交或回滚事务时自动关闭当前连接的所有打开的游标

嵌入式的SQL程序设计的更多相关文章

  1. 每周一书《Oracle 12 c PL(SQL)程序设计终极指南》

    本周为大家送出的书是<Oracle 12 c PL(SQL)程序设计终极指南>,此书由机械工业出版社出版, 孙风栋,王澜,郭晓惠 著. 内容简介: <Oracle 12c PL/SQ ...

  2. Oracle数据库之PL/SQL程序设计简介

    PL/SQL程序设计简介 一.什么是PL/SQL? PL/SQL是 Procedure Language & Structured Query Language 的缩写. ORACLE的SQL ...

  3. [推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下)

    原文:[推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下) [推荐]ORACLE PL/SQL编程详解之一: PL/SQL 程序设计简介(千里之行,始于足下 ...

  4. oracle pl/sql 程序设计 历史笔记整理

    20131016 周三 oracle pl/sql 程序设计 第2章 创建并运行pl/sql代码 sqlplus yjkhecc/yjkhecc@10.85.23.92:1521/orcl 在java ...

  5. 09 高效的PL/SQL程序设计

    程序包 Package 断开了依赖链 实验依赖关系: <1> 首先不使用包 -- 创建表 CREATE table t (x int); -- 创建视图 create view v as ...

  6. PL/SQL程序设计、流程控制

    PL/SQL是 Procedure Language & Structured Query Language 的缩写 PL/SQL是对SQL语言存储过程语言的扩展 PL/SQL程序由三个块组成 ...

  7. Spark2.x学习笔记:Spark SQL程序设计

    1.RDD的局限性 RDD仅表示数据集,RDD没有元数据,也就是说没有字段语义定义. RDD需要用户自己优化程序,对程序员要求较高. 从不同数据源读取数据相对困难. 合并多个数据源中的数据也较困难. ...

  8. PL/SQL程序设计

    1 PL/SQL简介 1 什么是PL/SQL? PL/SQL是 Procedure Language & Structured Query Language 的缩写.PL/SQL是对SQL语言 ...

  9. oracle PL/SQL程序设计

    declare 说明部分    (变量说明,光标申明,例外说明 ] begin 语句序列   (DML语句]… exception 例外处理语句 End; /

随机推荐

  1. php使用tcpdf实现在线PDF功能

    今天看书,发现有个例子就是实现php生成pdf格式文件的例子,所以扩展了下百度了下 找了个tcpdf Git上有地址,如果感冒自行下载 https://github.com/tecnickcom/tc ...

  2. !!! jquery mobile常用代码

    Jquery MOBILE:  (2014-7-1 发布jquery.mobile 1.4.3版本) <!doctype html> <html> <head> & ...

  3. c#面向对象基础5

    字符串  string (1)字符串的不可变性 当给字符串重新赋值时,老值没有被销毁,而是重新开辟了一块新的空间去储存新值<------------------堆中,在栈中地址发生变化重新指向新 ...

  4. [python爬虫] Selenium定向爬取PubMed生物医学摘要信息

    本文主要是自己的在线代码笔记.在生物医学本体Ontology构建过程中,我使用Selenium定向爬取生物医学PubMed数据库的内容.        PubMed是一个免费的搜寻引擎,提供生物医学方 ...

  5. Git常用命令速记与入门

    . 首页 博客园 联系我 前言:Git是什么. 常规初始化操作. 三种状态. 分支. add(添加)操作. 查看差异. Commit(提交)操作. Push(推送)与Pull(更新)操作. 移除文件. ...

  6. 4 python内置函数

    1.内置函数的整体介绍 内置参数官方详解 https://docs.python.org/3/library/functions.html?highlight=built#ascii 2.各内置函数介 ...

  7. UI5-文档-4.25-Sorting and Grouping

    为了使我们的发票列表更加用户友好,我们将它按字母顺序排序,而不是仅仅显示来自数据模型的顺序.此外,我们还引入了组,并添加了发布产品的公司,以便更容易使用数据. Preview The list is ...

  8. python内存泄漏

    记录: 一个脚本在连续运行后,使用内存越来越大,在循环后手动添加gc.collect()没有作用. 尝试方法: 去除所有函数中当作参数传入的全局变量 使用全局redis对象,不再当作参数传入 循环末尾 ...

  9. SOA和微服务到底是什么关系

    本文原创,原文地址为:http://www.cnblogs.com/fengzheng/p/5847441.html SOA和微服务到底是什么关系? 说实话,我确实不明白SOA和微服务到底有什么本质上 ...

  10. kafka相关资料

    先来说一下Kafka与RabbitMQ的对比: RabbitMQ,遵循AMQP协议,由内在高并发的erlanng语言开发,用在实时的对可靠性要求比较高的消息传递上. kafka是Linkedin于20 ...