• 嵌入式的SQL程序设计


    嵌入式的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. ");
    exit();
    }
    printf("Connected to database server. ");
    /* 下面声明一个 "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[30]
    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[30]
    CHAR companyname[30]
    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[30]
    EXEC SQL END DECLARE SECTION
    EXEC SQL SELECT COMPANYNAME INTO :COMPANYNAME
    FROM COMPANY WHERE COMPANYID='0001'
    
    --使用游标
    --当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[30]
    CHAR COMPANYNAME[30]
    EXEC SQL END DECLARE SECTION
    //输出信息//
    WHILE (SQLCODE==0)
    {
      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[30]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语句设置当提交或回滚事务时自动关闭当前连接的所有打开的游标
  • 相关阅读:
    jQuery扩展extend一
    json对象的操作,json工具
    typeof操作符的返回值
    jacksonall的使用,解析json
    jQuery的扩展
    An Introduction to Computer Thinking
    lazy初始化和线程安全的单例模式
    Compiler Principle
    Lineare Algebra
    Mathematik
  • 原文地址:https://www.cnblogs.com/wangprince2017/p/7695013.html
Copyright © 2020-2023  润新知