嵌入式SQL开发

14 篇文章 0 订阅
4 篇文章 0 订阅

        嵌入式sql是将sql语句嵌入到程序设计语言中,被嵌入的程序设计语言,如C、C++,JAVA,称为宿主语言,简称为主语言。

一:嵌入式sql如何转化为可识别的编译程序

 二:格式

为了区分sql语句和主语言语句,所有的sql语句都要加上EXEC SQL

C:

EXEC SQL <SQL语句>;

 三:通信控制

(1)向主语言传递SQL语句的执行状态信息,使主语言能够据此控制程序流程,主要用SQL通信区实现。

(2)主语言向SQL语句提供参数,主要用变量实现。

(3)将SQL语句查询数据库的结果交主语言处理,主要用主变量和游标实现。

以下分别介绍上述三种方法:

1. SQL通信区(SQLCA )

SQLCA 是一个数据结构,用途?

(1)SQL语句执行后,系统反馈给应用程序信息

         描述系统当前工作状态

         描述运行环境

(2)这些信息将送到SQL通信区中

(3)应用程序从SQL通信区中取出这些状态信息,据此决定接下来执行的语句

使用方法:

  • 定义SQLCA
EXEC SQL INCLUDE SQLCA
  • 使用SQLCA

1. SQL中有一个存放每次执行SQL语句后返回代码的变量 SQLCODE

2. 如果SQLCODE等于预定义的常量SUCCESS,表示语句成功!否则出错!

3。 应用程序每执行完一条SQL语句后都应该测试一下SQLCODE,以了解该SQL语句执行情况并做相应处理

 2. 主变量和指示变量

1. 主变量:

(1). 嵌入式SQL语句中可以使用主语言的程序变量来输入或输出数据

(2). 在SQL语句中使用的与程序的变量简称为主变量

类型划分:

输入主变量:由应用程序对其赋值,SQL语句引用

输出主变量:由SQL语句对其赋值或设置状态信息,返回给应用程序 

2. 指示变量:(理解为一种标志位)

 (1)指示变量是一个整型变量,用来“指示”所指比主变量的值或条件

 (2)一个主变量可以附带一个指示变量

用途:

1. 指示输入主变量是否为空值

2. 检测输出变量是否为空值,值是否被截断 

 3. 变量使用

定义方法:

EXEC SQL BEGIN DECLARE SECTION

...
...
... (用来说明主变量和指示变量)

EXEC SQL END DECALRE SECTION

 使用方法:

主变量:

1. 使用在任何一个能够使用表达式的SQL语句上

2. 变量名前加冒号(:)作为区分

指示变量:

1. 变量名前加冒号(:)作为区分

2. 紧跟所指主变量之后 

注:SQL语句之外,随便用,不用加冒号 

四:游标的使用

为什么要使用游标?

 什么是游标?

1. 游标是系统为用户开设的一个数据缓冲区,存放SQL的执行结果

2. 每个游标区的都有一个名字

3. 用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交给主语言进一步处理

 不用游标的语句:

 使用方法:

打开游标
EXEC SQL OPEN <游标名>
说明:1. 打开游标实际上是执行相应的SELECT语句,把查询结果取到缓冲区中
     2. 这时游标处于活动状态,指标指向查询结果集中的第一条记录

使用FETCH语句推进游标的指针
EXEC SQL FETCH <游标名>
        into <主变量>[<指示变量>]
              [<主变量>[<指示变量>]]...;
功能:
     指定方向推动游标指针,同时将缓冲区中的当前记录取出来送至主变量供主语言进一步处理

五:动态SQL

主变量为SQL语句的内容,不是原来保存数据的输入或输出变量

SQL语句主变量在程序执行期间可以设定不同的SQL语句,然后立即执行

使用:

使用动态参数的步骤
(1)声明SQL语句主变量
(2)准备SQL语句(PREPARE)
    EXEC SQL PREPARE<语句名>
        from<SQL语句主变量>

六:嵌入式mysql的写法

一般会写到mysql.h的头文件中

基本流程大致相同:

1. 连接数据库:
    MYSQL conn
    ret =  start_db(&conn) (返回验证码ret判断是否连接成功)


2. 输入查询语句 判断是否存在数据
    mysqlstr =  "select count(*) from XXX where XXXX ";
    mysql_query(conn, mysqlstr) # 出错判断


3. 检索了数据的每个查询,并保存到result中
  (SELECT、SHOW、DESCRIBE、EXPLAIN、CHECK TABLE等),必须调用mysql_store_result()或mysql_use_result()。
    result = mysql_store_result(conn)


4. 从result结果集中取得行作为数字数组
   我们使用mysql_fetch_row()函数
   row = mysql_fetch_row(result) 

# 也就是从0开始,输出类似的结果
[0] => Adams
[1] => John
[2] => London

5. 如果读取select出来的每一行
# 如果row不是空,用if也行
while ((row = mysql_fetch_row(result))){
    printf(row[0])
    printf(row[1])
    printf(row[3])
    printf(row[4])
    printf(row[5])

}

if ((row = mysql_fetch_row(result))){
    printf(row[0])
    printf(row[1])
    printf(row[3])
    printf(row[4])
    printf(row[5])

}

注:c语言中的char数组,需要使用'\0'结尾,而java和python不需要。                                                    

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值