zoukankan      html  css  js  c++  java
  • 嵌入式的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语句设置当提交或回滚事务时自动关闭当前连接的所有打开的游标
  • 相关阅读:
    hdu 2222 Keywords Search
    Meet and Greet
    hdu 4673
    hdu 4768
    hdu 4747 Mex
    uva 1513 Movie collection
    uva 12299 RMQ with Shifts
    uva 11732 strcmp() Anyone?
    uva 1401
    hdu 1251 统计难题
  • 原文地址:https://www.cnblogs.com/wangprince2017/p/7695013.html
Copyright © 2011-2022 走看看