最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

嵌入式SQL和動態(tài)SQL的具體使用

 更新時間:2024年05月30日 08:27:20   作者:有請小發(fā)菜  
嵌入式SQL和動態(tài)SQL是兩種在應用程序中嵌入和使用SQL語句的方法,本文主要介紹了嵌入式SQL和動態(tài)SQL的具體使用,具有一定的參考價值,感興趣的可以了解一下

基本概述

嵌入式SQL和動態(tài)SQL是兩種在應用程序中嵌入和使用SQL語句的方法。它們都允許開發(fā)人員在編程語言中編寫SQL語句,以便在應用程序中執(zhí)行數(shù)據(jù)庫操作。然而,這兩種方法在實現(xiàn)方式、性能和靈活性方面存在一些差異。

嵌入式SQL是一種將SQL語句直接嵌入到宿主語言(如C、C++、Java等)代碼中的方法。在這種情況下,開發(fā)人員需要使用特定的語法和預處理器來將SQL語句與宿主語言代碼集成在一起。嵌入式SQL的主要優(yōu)點是它允許開發(fā)人員在編寫應用程序時使用熟悉的宿主語言語法,同時仍然能夠利用SQL的強大功能。此外,嵌入式SQL通常具有較好的性能,因為它允許編譯器在編譯時檢查SQL語句的有效性,并生成優(yōu)化的代碼。

動態(tài)SQL是一種在運行時構(gòu)建和執(zhí)行SQL語句的方法。在這種情況下,開發(fā)人員需要使用字符串拼接或模板引擎等技術(shù)來動態(tài)生成SQL語句。然后,這些語句可以在應用程序運行時傳遞給數(shù)據(jù)庫服務器進行執(zhí)行。動態(tài)SQL的主要優(yōu)點是它具有很高的靈活性,因為它允許開發(fā)人員根據(jù)運行時條件構(gòu)建和修改SQL語句。這使得動態(tài)SQL非常適合處理復雜的查詢和更新操作,以及支持用戶自定義的查詢和報告功能。然而,動態(tài)SQL的性能可能較差,因為它需要在運行時解析和優(yōu)化SQL語句,這可能導致額外的開銷。

總的來說,嵌入式SQL和動態(tài)SQL各有優(yōu)缺點。嵌入式SQL適用于那些需要高性能和編譯時錯誤檢查的場景,而動態(tài)SQL適用于那些需要高度靈活性和運行時動態(tài)生成SQL語句的場景。在選擇使用哪種方法時,開發(fā)人員應權(quán)衡這些因素,并根據(jù)應用程序的具體需求做出決策。

在實際開發(fā)過程中,開發(fā)人員可能需要結(jié)合使用嵌入式SQL和動態(tài)SQL。例如,他們可以使用嵌入式SQL編寫大部分數(shù)據(jù)庫操作,以確保高性能和編譯時錯誤檢查;同時,對于需要高度靈活性的部分,可以使用動態(tài)SQL來實現(xiàn)。這種混合方法可以充分利用兩種方法的優(yōu)點,同時避免它們的局限性。

嵌入式 SQL

SQL 提供了將 SQL 語句嵌入某種高級語言中的使用方式,但是如何識別嵌入在高級語言中的 SQL 語句,通常采用預編譯的方法。該方法的關鍵問題是必須區(qū)分主語言中嵌入的 SQL語句,以及主語言和 SQL 間的通信問題。采用的方法由 DBMS 的預處理程序?qū)υ闯绦蜻M行掃描,識別出 SQL 語句,把它們轉(zhuǎn)換為主語言調(diào)用語句,以使主語言編譯程序能識別它,最后由主語言的編譯程序?qū)⒄麄€源程序編譯成目標碼。

如何區(qū)分主語言語句與 SQL 語句?

需要在所有的 SQL 語句前加前綴 EXEC SQL,而 SQL 的結(jié)束標志隨主語言的不同而不同。

  • PL/1 和 C 語言的引用格式為:EXEC SQL <SQL語句>;
  • COBOL 語言的引用格式為:EXEC SQL <SQL 語句> END-EXEC;

主語言與數(shù)據(jù)庫如何通信?

(1)SQL 通信區(qū) (SQL Communication Area,SQLCA) 向主語言傳遞 SQL 語句執(zhí)行的狀態(tài)信息,使主語言能夠根據(jù)此信息控制程序流程。

(2)主變量也稱共享變量。主語言向 SQL 語句提供參數(shù)主要通過主變量,主變量由主語言的程序定義,并用 SQL 的 DECLARE 語句說明,引用變量一定要加上:。

EXEC SQL BEGIN DECLARE SECTION;    /*說明主變量*/
	char Msno[4],Mcno[3],Givensno[5];
	int Mgrade;
	char SQLSTATE[6];
EXEC SQL END DECLARE SECTION;

分析:以上說明了五個共享變量,其中,SQLSTATE 是一個特殊的共享變量,解釋 SQL 語句執(zhí)行狀況的作用。當 SQL 語句執(zhí)行成功時,系統(tǒng)自動給 SQLSTATE 賦值上全零值,否則為非全零(”02000”)。因此,當執(zhí)行一條SQL語句后,可以根據(jù) SQLSTATE 的值轉(zhuǎn)向不同的分支,以控制程序的流向。引用時,為了與 SQL 屬性名相區(qū)別,需在主變量前加: 。

示例1. 根據(jù)共享變量 givensno 值查詢學生關系students 中學生的姓名、年齡和性別。

EXEC SQL SELECT sname,age,sex
	INTO :Msno,Mcno,:givensno
	FROM students
	WHERE sno=:Msno;

示例2. 某學生選修了一門課程信息,將其插入學生選課表SC中,假設學號、課程號、成績已分別賦給主變量HSno、Hcno和Hgrade。

EXEC SQL INSERT 
	INTO SC(Sno,Cno,Grade)
	VALUES(:Hsno,:Hcno,:Hgrade);

(3)游標。SQL 語言是面向集合的,一條 SQL 語句可產(chǎn)生或處理多條記錄。而主語言是面向記錄的,一組主變量一次只能放一條記錄,所以,引入游標,通過移動游標指針來決定獲取哪一條記錄。

  • 定義游標:說明性語句,定義中的 SELECT 語句并不立即執(zhí)行。語法如下:
EXEC SQL DECLARE <游標名> CURSOR FOR 
	<SELECT 語句>
  • 打開游標:執(zhí)行游標定義中的 SELECT 語句,同時游標處于活動狀態(tài),游標是一個指針,此時指向查詢結(jié)果的第一行之前。語法如下:
EXEC SQL OPEN <游標名> 
  • 推進游標:使用時,游標會推進一行,并把指針指向的行(稱為當前行)中的值取出,送到共享變量中。變量表由逗號分開的共享變量組成。該語句經(jīng)常用于宿主程序的循環(huán)結(jié)構(gòu)中,并借助宿主語言的處理語句逐一處理查詢結(jié)果中的一個元組。語法如下:
EXEC SQL FETCH FROM <游標名> INTO <變量表> 
  • 關閉游標:使用時,關閉游標,不再和查詢結(jié)果相聯(lián)系。關閉了的游標,可以再次打開,與新的查詢結(jié)果相聯(lián)系。在游標處于活動狀態(tài)時,可以修改和刪除游標指向的元組。語法如下:
EXEC SQL CLOSE <游標名> 

示例3. 在C語言中嵌入SQL的查詢,檢索某學生的學習成績,其學號由共享主變量givensno給出,結(jié)果放在主變量Sno,Cno,Grade中。如果成績不及格,則刪除該記錄,如果成績?yōu)?0~69分,則將成績修改為70分,并顯示學生的成績信息(除60分以下的)

#DEFINE NO_MORE_TUPLES !(strcmp(SQLSTATE,"02000"))
void sel()
{EXEC SQL BEGIN DECLARE SECTION;  /*說明主變量*/
	char Msno[4],Mcno[3],givensno[5];
	int Mgrade;
	char SQLSTATE[6];
EXEC SQL END DECLARE SECTION;
EXEC SQL DECLARE Scx CURSOR FOR  /* 說明游標Scx,將查詢結(jié)果與Scx建立聯(lián)系*/
	SELECT Sno,Cno,Grade
	FROM SC
	WHERE Sno=:givensno;
EXEC SQL OPEN Scx;
While(1)                        /* 用循環(huán)結(jié)構(gòu)逐條處理結(jié)果集中的記錄*/
{EXEC SQL FETCH FROM Scx        /* 游標推進一行*/
	INTO :Msno,:Mcno,:Mgrade;     /* 送入主變量,注意每個變量要加分號;*/
 if (NO_MORE_TUPLES) Break;      /* 處理完退出循環(huán)*/
 print("%s,%s,%d\n",sno,cno,g);
 };
 if (Mgrade<60)                  /* 成績<60*/
	EXEC SQL DELETE FROM SC WHERE CURRENT OF Scx;
 Else 
	{if (Mgrade < 70)             /* 成績<70*/
			EXEC SQL UPDATE SC SET grade = 70 WHERE CURRENT OF Scx;
			MGrade = 70
	}
	Printf("%s,%s,%d",Msno,Mcno,Mgrade); /*顯示學生記錄*/
EXEC SQL CLOSE Scx;            /* 關閉游標*/
};

動態(tài) SQL

動態(tài) SQL 允許程序在運行時構(gòu)造、提交 SQL 查詢。使用動態(tài) SQL 語句時,還可以改進技術(shù);當預備語句組合而成的 SQL 語句只需執(zhí)行一次, 那么預備語句可以在程序運行時由用戶輸入才組合起來,但并不執(zhí)行。

動態(tài) SQL 預備語句格式

EXEC SQL PREPARE <動態(tài)SQL語句名> FROM <共享變量或字符串>;

動態(tài) SQL 執(zhí)行語句格式

EXEC SQL EXECUTE <動態(tài)SQL語句名>;

示例4. 動態(tài) SQL 示例

char*query = "UPDATE sc SET Grade = Grade*1.1 WHERE Cno = ?";
EXEC SQL PREPARE dynprog FROM :query;
char cno[5] = "C4";
EXEC SQL EXECUTE dynprog USING :cno;

總結(jié)

嵌入式SQL和動態(tài)SQL是兩種在應用程序中嵌入和使用SQL語句的方法。它們各自具有一定的優(yōu)勢和局限性,適用于不同的場景。開發(fā)人員應根據(jù)應用程序的具體需求選擇合適的方法,并在必要時結(jié)合使用這兩種方法,以實現(xiàn)最佳的性能和靈活性。

到此這篇關于嵌入式SQL和動態(tài)SQL的具體使用的文章就介紹到這了,更多相關嵌入式SQL和動態(tài)SQL內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • sql server 自定義分割月功能詳解及實現(xiàn)代碼

    sql server 自定義分割月功能詳解及實現(xiàn)代碼

    這篇文章主要介紹了sql server 自定義分割月功能詳解及實現(xiàn)代碼的相關資料,需要的朋友可以參考下
    2016-10-10
  • 訪問和更改關系數(shù)據(jù),使用MSSQL外聯(lián)接

    訪問和更改關系數(shù)據(jù),使用MSSQL外聯(lián)接

    訪問和更改關系數(shù)據(jù),使用MSSQL外聯(lián)接...
    2007-02-02
  • 揭秘SQL Server 2014有哪些新特性(1)-內(nèi)存數(shù)據(jù)庫

    揭秘SQL Server 2014有哪些新特性(1)-內(nèi)存數(shù)據(jù)庫

    微軟SQL Server 2014提供了眾多激動人心的新功能,但其中最讓人期待的特性之一就是代號為” Hekaton”的內(nèi)存數(shù)據(jù)庫了,內(nèi)存數(shù)據(jù)庫特性并不是SQL Server的替代,而是適應時代的補充,現(xiàn)在SQL Server具備了將數(shù)據(jù)表完整存入內(nèi)存的功能。那么今天我們就先來看看內(nèi)存數(shù)據(jù)庫
    2014-08-08
  • SQLserver 表拆分的使用示例

    SQLserver 表拆分的使用示例

    在SQL中表拆分是一種將大型表物理地分成多個更小、更易于管理的部分的技術(shù),下面就來介紹一下SQLserver 表拆分的使用示例,感興趣的可以了解一下
    2025-09-09
  • sqlserver中去除字符串中連續(xù)的分隔符的sql語句

    sqlserver中去除字符串中連續(xù)的分隔符的sql語句

    sqlserver中去除字符串中連續(xù)的分隔符的sql語句,需要的朋友可以參考下
    2012-05-05
  • Navicat連接SQL Server數(shù)據(jù):報錯08001-命名管道提供程序的完美解決方法

    Navicat連接SQL Server數(shù)據(jù):報錯08001-命名管道提供程序的完美解決方法

    小編新安裝了sqlserver用navicat進行連接時出現(xiàn)一系列問題,不知道該怎么解決,小編小編給大家分享一篇教程關于Navicat連接SQL Server數(shù)據(jù):報錯08001-命名管道提供程序的問題,感興趣的朋友一起看看吧
    2021-08-08
  • Sqlserver創(chuàng)建用戶并授權(quán)的實現(xiàn)步驟

    Sqlserver創(chuàng)建用戶并授權(quán)的實現(xiàn)步驟

    這篇文章主要介紹了Sqlserver創(chuàng)建用戶并授權(quán)的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • SQL SELECT DISTINCT 語句實例詳解

    SQL SELECT DISTINCT 語句實例詳解

    本文將深入探討 SELECT DISTINCT 語句,詳細講解它的用法、原理以及常見的應用場景,幫助你理解如何精準地去除重復數(shù)據(jù),感興趣的朋友跟隨小編一起看看吧
    2025-06-06
  • 列出SQL Server中具有默認值的所有字段的語句

    列出SQL Server中具有默認值的所有字段的語句

    上個星期我在對一個供應商開發(fā)的數(shù)據(jù)庫按規(guī)定進行故障排除的時候,我們需要對他們數(shù)據(jù)庫中50個表的每一個都進行查看,以確保所有期望是默認值的字段都被分配了默認值。你可以想象這是一個多么令人畏懼的工作,而我立即提出了這個問題。有沒有一個比在SQL Server管理套件中打開每一個表來查看這個schema的更好方法嗎?
    2008-10-10
  • Sql?Server?"用戶登錄失敗,錯誤編18456"的解決過程

    Sql?Server?"用戶登錄失敗,錯誤編18456"的解決過程

    在我們使用數(shù)據(jù)庫的時候,偶爾會遇到一些登錄上的錯誤提示,下面這篇文章主要給大家介紹了關于Sql?Server?"用戶登錄失敗,錯誤編18456"的解決過程,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2022-09-09

最新評論

恩施市| 遵义县| 阆中市| 西盟| 二连浩特市| 永新县| 开江县| 钦州市| 高阳县| 司法| 黄龙县| 新竹市| 鸡西市| 岢岚县| 武山县| 上饶市| 霍林郭勒市| 平江县| 泰安市| 冕宁县| 江山市| 景宁| 蓝山县| 随州市| 沅江市| 临西县| 罗定市| 谷城县| 南涧| 蕲春县| 离岛区| 荆州市| 呈贡县| 介休市| 石狮市| 和硕县| 双鸭山市| 海南省| 汉中市| 逊克县| 栖霞市|