国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

一文詳解嵌入式SQL

瀏覽:7日期:2023-03-06 14:25:51
目錄
  • 嵌入式SQL概述
  • 使用嵌入式SQL的注意事項(xiàng)
    • 區(qū)分SQL語(yǔ)句與主語(yǔ)言語(yǔ)句
    • 數(shù)據(jù)庫(kù)工作單元和程序工作單元之間的通信
    • 協(xié)調(diào)兩種不同的處理方式
  • 嵌入式SQL程序的組成
    • 程序首都
    • 程序體
  • 在嵌入式SQL中使用游標(biāo)檢索多個(gè)元組
    • 游標(biāo)定義語(yǔ)句
    • 游標(biāo)打開(kāi)語(yǔ)句
    • 游標(biāo)推進(jìn)語(yǔ)句
    • 游標(biāo)關(guān)閉語(yǔ)句
  • 嵌入式SQL程序?qū)嵗?/li>

    嵌入式SQL概述

    嵌入式SQL(Embedded SQL) 是應(yīng)用系統(tǒng)使用編程方式來(lái)訪(fǎng)問(wèn)和管理數(shù)據(jù)庫(kù)中數(shù)據(jù)的主要方式之一。

    SQL語(yǔ)言有兩種使用方式:一種是作為獨(dú)立語(yǔ)言,以交互式方式使用,在這種方式下使用的SQL語(yǔ)言是面向集合的描述性語(yǔ)言,是非過(guò)程化的。即大多數(shù)語(yǔ)句都是獨(dú)立執(zhí)行,與上下文無(wú)關(guān)的。另一種是嵌入到某種高級(jí)語(yǔ)言中使用,利用高級(jí)語(yǔ)言的過(guò)程化結(jié)構(gòu)來(lái)彌補(bǔ)SQL語(yǔ)言在實(shí)現(xiàn)諸如流程控制等復(fù)雜應(yīng)用方面的不足。這種方式下使用的SQL語(yǔ)言稱(chēng)為嵌入式SQL( Embedded SQL),能嵌入SQL的高級(jí)語(yǔ)言稱(chēng)為主語(yǔ)言(Host Language)或宿主語(yǔ)言。目前SQL標(biāo)準(zhǔn)中指定的宿主語(yǔ)言主要有C、C++、COBOL、Pascal、Java、PL/I和FORTRAN等。

    對(duì)于嵌入式SQL, DBMS一般采用預(yù)編譯的方法,即由DBMS的預(yù)處理程序?qū)υ闯绦蜻M(jìn)行掃描識(shí)別出SQL語(yǔ)句,并把它們轉(zhuǎn)換成主語(yǔ)言中相應(yīng)的調(diào)用語(yǔ)句,成為主語(yǔ)言源程序,以使主語(yǔ)言編譯程序能夠識(shí)別它們,最后由主語(yǔ)言的編譯程序?qū)⑺幾g成目標(biāo)代碼,如下圖所示。

    使用嵌入式SQL的注意事項(xiàng)

    把SQL嵌入主語(yǔ)言使用時(shí)必須要解決下面幾個(gè)問(wèn)題:

    區(qū)分SQL語(yǔ)句與主語(yǔ)言語(yǔ)句

    主要通過(guò)在所有的SQL語(yǔ)句前加前綴EXEC SQL來(lái)解決。SQL語(yǔ)句一般以分號(hào)(;) 作為結(jié)束的標(biāo)志

    EXEC SQL <SQL語(yǔ)句>;

    數(shù)據(jù)庫(kù)工作單元和程序工作單元之間的通信

    嵌入式SQL語(yǔ)句中可以使用主語(yǔ)言的程序變量來(lái)輸入或輸出數(shù)據(jù)。把SQL語(yǔ)句中使用的主語(yǔ)言程序變量簡(jiǎn)稱(chēng)為主變量或共享變量。

    主變量根據(jù)其作用的不同,分為輸入主變量和輸出主變量。輸入主變量由應(yīng)用程序?qū)ζ滟x值,SQL語(yǔ)句引用;輸出主變量由SQL語(yǔ)句對(duì)其賦值或設(shè)置狀態(tài)信息,返回給應(yīng)用程序。一個(gè)主變量有可能既是輸入主變量又是輸出主變量。在SQL語(yǔ)句中使用主變量時(shí),需在主變量名前加冒號(hào)(:)作為標(biāo)志,以區(qū)別于數(shù)據(jù)庫(kù)對(duì)象的表名或?qū)傩悦?字段名)。

    SQL語(yǔ)句執(zhí)行后,系統(tǒng)要反饋給應(yīng)用程序若干信息,這些信息被送到稱(chēng)為SQL的通信區(qū)的SQLCA中。SQLCA用語(yǔ)句EXEC SQL INCLUDE加以定義。SQLCA 是一個(gè)數(shù)據(jù)結(jié)構(gòu),SQLCA中有一個(gè)存放每次執(zhí)行SQL語(yǔ)句后返回代碼的狀態(tài)指示變量SQLCODE。當(dāng)SQLCODE為零時(shí),表示SQL語(yǔ)句執(zhí)行成功,否則返回一個(gè)錯(cuò)誤代碼(負(fù)值)或警告信息(正值)。

    協(xié)調(diào)兩種不同的處理方式

    一般情況下,一個(gè)SQL查詢(xún)一次可以檢索多個(gè)元組(面向集合),而主語(yǔ)言程序通常是"一次一個(gè)元組"(面向記錄)處理,為此必須協(xié)調(diào)這兩種不同的處理方式,目前大多使用游標(biāo)(curor)技術(shù)來(lái)進(jìn)行協(xié)調(diào),關(guān)于游標(biāo)的定義和使用方法將在稍后闡述。

    嵌入式SQL程序的組成

    一個(gè)帶有嵌入式SQL的程序一般包括兩大部分:程序首都和程序體 。程序首都是由一些說(shuō)明性語(yǔ)句組成,而程序體則由一些可執(zhí)行語(yǔ)句組成。

    程序首都

    程序首部主要包括的語(yǔ)句有:

    ①聲明段:用于定義主變量。主變量既可以被主語(yǔ)言語(yǔ)句使用,也可以被SQL語(yǔ)句使用,所以也稱(chēng)共享變量。主變量在EXEC SQL BECIN DECLARE SECTION; 和 EXEC SQL END DECLARE SECTION;之間進(jìn)行說(shuō)明。
    ②定義SQL通信區(qū):使用EXEC SQL INCLUDE SQLCA語(yǔ)句定義用于在程序和DBMS之間通信的通信區(qū)。SQLCA中包含兩個(gè)通信變量SQLCODE和SQLSTATE。SQLCODE變量是一個(gè)整數(shù)變量,當(dāng)執(zhí)行了數(shù)據(jù)庫(kù)命令之后,DBMS會(huì)返回一個(gè)SQLCODE值。如果這個(gè)值是0,則表明DBMS已成功執(zhí)行此語(yǔ)句。如果SQLCODE>0,則表明在該查詢(xún)結(jié)果中沒(méi)有的更多可用的數(shù)據(jù)(記錄)。如果SQLCODE<0,則表明出現(xiàn)了錯(cuò)誤。SQLSTATE 是一個(gè)帶有5 個(gè)字符的字符串。如果SQLSTATE的值為00000則表示沒(méi)有錯(cuò)誤或異常;如果是其他值,就表明出現(xiàn)了錯(cuò)誤或異常。
    ③其他說(shuō)明性語(yǔ)句

    程序體

    程序體由若干個(gè)可執(zhí)行的SQL語(yǔ)句和主語(yǔ)言語(yǔ)句組成。包括建立和關(guān)閉與數(shù)據(jù)庫(kù)連接的語(yǔ)句。
    建立與一個(gè)數(shù)據(jù)庫(kù)連接的SQL命令如下:

    EXEC SQL CONNECT TO <服務(wù)器名> AS <連接名> AUTHORIZATION <用戶(hù)賬戶(hù)名和口令>;

    或者如下:

    EXEC SQL CONNECT:<用戶(hù)名> identified by:<用戶(hù)口令> using:<數(shù)據(jù)庫(kù)服務(wù)器路徑>;

    一般情況下 ,由于一個(gè)用戶(hù)或程序可以訪(fǎng)問(wèn)多個(gè)數(shù)據(jù)庫(kù)服務(wù)器,因此可以建立多個(gè)連接,但是任何時(shí)刻只能有一個(gè)連接是活動(dòng)的。用戶(hù)可以使用<連接名>將當(dāng)前活動(dòng)的連接轉(zhuǎn)換為另一個(gè)連接,命令如下:

    EXEC SQL SET CONNECTION <連接名>;

    如果不再需要某個(gè)連接了,可以使用如下命令終止這個(gè)連接:

    EXEC SQL DISCONNECT <連接名>;

    在嵌入式SQL中使用游標(biāo)檢索多個(gè)元組

    一般來(lái)說(shuō),一個(gè)SQL查詢(xún)一次可以檢索多個(gè)元組,而主語(yǔ)言程序通常是"一次一個(gè)元組"處理,可以使用游標(biāo)協(xié)調(diào)這兩種不同的處理方式。

    與游標(biāo)相關(guān)的SQL語(yǔ)句有下列四個(gè):

    游標(biāo)定義語(yǔ)句

    EXEC SQL DECLARE <游標(biāo)名> CURSOR FOR <SELECT語(yǔ)句>;

    游標(biāo)打開(kāi)語(yǔ)句

    EXEC SQL OPEN <游標(biāo)名>;

    游標(biāo)推進(jìn)語(yǔ)句

    EXEC SQL FETCH <游標(biāo)名> INTO [<:主變量名>[,<:主變量名>]...];

    游標(biāo)關(guān)閉語(yǔ)句

    EXEC SQL CLOSE <游標(biāo)名>;

    嵌入式SQL程序?qū)嵗?/h2>

    下面使用一個(gè)案例來(lái)對(duì)嵌入式SQL進(jìn)行一個(gè)講解,幫助讀者更好地理解嵌入式 SQL的使用,在本案例中使用的宿主語(yǔ)言為C語(yǔ)言。

    案例需求: 現(xiàn)有一數(shù)據(jù)庫(kù),內(nèi)含一張數(shù)據(jù)庫(kù)表customers,表中主要存儲(chǔ)了客戶(hù)的專(zhuān)屬折扣和id號(hào)。每個(gè)客戶(hù)有且只有一個(gè)專(zhuān)屬折扣,即在表中每條數(shù)據(jù)都是唯一的。在C語(yǔ)言中使用嵌入式SQL語(yǔ)句,輸入相關(guān)客戶(hù)的id號(hào),查找輸出數(shù)據(jù)庫(kù)的customer表中相關(guān)客戶(hù)的信息,數(shù)據(jù)庫(kù)用戶(hù)名和服務(wù)器名均為175_178_184_206。

    #include<stdio.h>#include"prompt.h"exec sql include sqlca; --sqlca 表示SQL的通信區(qū), communication areachar cid_prompt[]="please enter customer id:";--輸入查詢(xún)的客戶(hù)編號(hào)變量cidint main(){? ? exec sql begin declare section; --下面聲明變量? ? char cust_id[5], cust_name[14];--客戶(hù)id號(hào)和客戶(hù)姓名? ? float cust_discnt;--客戶(hù)折扣? ? exec sql end declare section;? ? exec sql whenever sqlerror goto report_error;-- 錯(cuò)誤捕獲? ? exec sql whenever not found goto notfound; ?-- 記錄沒(méi)有找到? ? exec sql connect:"customer" identified by:"xxxxxx" using:"url"; ?-- 連接數(shù)據(jù)庫(kù)? ? --另注:因?yàn)殡[私保密原因? ? --在此數(shù)據(jù)庫(kù)密碼使用了xxxxxx代替? ? --數(shù)據(jù)庫(kù)服務(wù)器路徑使用了url代替? ? --實(shí)際使用時(shí)根據(jù)自己需求替換? ? while((prompt(cid_prompt,1,cust_id,4))>=0){? ? ? ? exec sql select cname,discnt into :cust_name,:cust_discnt? ? ? ? from customers where cid=:cust_id; -- 根據(jù)輸入的客戶(hù)id 找到名字和折扣? ? ? ? exec sql commit work;-- 提交? ? ? ? printf("customer"s name is %s and discount?? ? ? ? is %.1f\n",cust_name, cust_discnt);? ? ? ? continue; -- 接著循環(huán),再輸入客戶(hù)id?? ? notfound:printf("can"t find customer %s, continuing\n", cust_id);}? ? exec sql commit release; -- 斷開(kāi)數(shù)據(jù)庫(kù)的連接? ? return 0;? ? report_error: ?-- 前面報(bào)錯(cuò)的執(zhí)行? ? ? ? print_dberror();--打印報(bào)錯(cuò)? ? ? ? exec sql rollback release; -- 斷開(kāi)連接? ? ? ? return 1;}

    到此這篇關(guān)于一文詳解嵌入式SQL的文章就介紹到這了,更多相關(guān)嵌入式SQL內(nèi)容請(qǐng)搜索以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持!

    標(biāo)簽: MsSQL
    相關(guān)文章:
    主站蜘蛛池模板: 色九九| 四虎免费大片aⅴ入口 | 国产一区二区三区在线免费观看 | 国产精品爱久久久久久久小 | 日本一区毛片免费观看 | 美女张开腿男人桶 | 成人免费视频网址 | 亚洲精品一区二区三区福利 | 久久久久视频精品网 | 欧美自拍视频在线 | 视频精品一区 | 草草影院欧美三级日本 | 深夜福利成人 | 特级黄色毛片在放 | 亚洲国产精品不卡毛片a在线 | 亚洲综合影视 | 久草在线免费播放 | 美日韩一区二区三区 | 一区二区国产在线观看 | 日韩在线不卡一区在线观看 | 国产美女主播一级成人毛片 | 思思久热re6这里有精品 | 国产亚洲精品久久久久久 | 欧美特级特黄a大片免费 | 成人免费的性色视频 | 精品极品三级久久久久 | 99精彩免费观看 | 毛片网站观看 | 国产成人丝袜网站在线看 | 97久久草草超级碰碰碰 | 97精品国产91久久久久久 | 国产亚洲高清不卡在线观看 | 亚洲在线精品 | 天堂中文资源在线8 | 欧美专区在线视频 | 国产毛片a| 日韩欧美精品综合一区二区三区 | 视频偷拍一级视频在线观看 | 草草影院私人免费入口 | 国产欧美日韩一区二区三区 | 国产一在线 |