SQL 語言:嵌入式 SQL 和動態 SQL

文章目錄

    • 基本概述
    • 嵌入式 SQL
    • 動態 SQL
    • 總結

基本概述

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

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

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

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

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

嵌入式 SQL

SQL 提供了將 SQL 語句嵌入某種高級語言中的使用方式,但是如何識別嵌入在高級語言中的 SQL 語句,通常采用預編譯的方法。該方法的關鍵問題是必須區分主語言中嵌入的 SQL語句,以及主語言和 SQL 間的通信問題。采用的方法由 DBMS 的預處理程序對源程序進行掃描,識別出 SQL 語句,把它們轉換為主語言調用語句,以使主語言編譯程序能識別它,最后由主語言的編譯程序將整個源程序編譯成目標碼。

如何區分主語言語句與 SQL 語句?

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

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

主語言與數據庫如何通信?

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

(2)主變量也稱共享變量。主語言向 SQL 語句提供參數主要通過主變量,主變量由主語言的程序定義,并用 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 語句執行狀況的作用。當 SQL 語句執行成功時,系統自動給 SQLSTATE 賦值上全零值,否則為非全零(”02000”)。因此,當執行一條SQL語句后,可以根據 SQLSTATE 的值轉向不同的分支,以控制程序的流向。引用時,為了與 SQL 屬性名相區別,需在主變量前加:

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

EXEC SQL SELECT sname,age,sexINTO :Msno,Mcno,:givensnoFROM studentsWHERE sno=:Msno;

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

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

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

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

示例3. 在C語言中嵌入SQL的查詢,檢索某學生的學習成績,其學號由共享主變量givensno給出,結果放在主變量Sno,Cno,Grade中。如果成績不及格,則刪除該記錄,如果成績為60~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,將查詢結果與Scx建立聯系*/SELECT Sno,Cno,GradeFROM SCWHERE Sno=:givensno;
EXEC SQL OPEN Scx;
While(1)                        /* 用循環結構逐條處理結果集中的記錄*/
{EXEC SQL FETCH FROM Scx        /* 游標推進一行*/INTO :Msno,:Mcno,:Mgrade;     /* 送入主變量,注意每個變量要加分號;*/if (NO_MORE_TUPLES) Break;      /* 處理完退出循環*/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;            /* 關閉游標*/
};

動態 SQL

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

動態 SQL 預備語句格式

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

動態 SQL 執行語句格式

EXEC SQL EXECUTE <動態SQL語句名>;

示例4. 動態 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;

總結

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/19082.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/19082.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/19082.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java數據結構與算法(紅黑樹)

前言 紅黑樹是一種自平衡二叉搜索樹&#xff0c;確保在插入和刪除操作后&#xff0c;樹的高度保持平衡&#xff0c;從而保證基本操作&#xff08;插入、刪除、查找&#xff09;的時間復雜度為O(log n)。 實現原理 紅黑樹具有以下性質&#xff1a; 每個節點要么是紅色&#…

go語言學習之旅之Go結構體

在Go語言中&#xff0c;結構體&#xff08;struct&#xff09;是一種用戶定義的數據類型&#xff0c;用于組合不同類型的數據項。結構體可以包含其他結構體或基本數據類型的字段。以下是關于Go語言結構體的基本知識&#xff1a; 定義結構體&#xff1a; package mainimport &…

Python 之微信指數小程序數據抓取

Fiddler安裝和設置 安裝 Fiddler 安裝包可以從這里獲取&#xff0c;如果失效了可以自己網上找一個安裝。 鏈接&#xff1a;https://pan.baidu.com/s/1N30BoDWm2_dBL8i8GRzK5g?pwd1znv 提取碼&#xff1a;1znv 然后就是點擊安裝就好了&#xff0c;沒什么好多說的。 啟用…

刷代碼隨想錄有感(83):貪心算法——最大子數組和

題干&#xff1a; 代碼&#xff1a; class Solution { public:int maxSubArray(vector<int>& nums) {int res INT_MIN;int count 0;for(int i 0; i < nums.size(); i){count nums[i];if(count > res) res count;if(count < 0)count 0;}return res;} …

【創作活動】探索 GPT-4o:下一代語言模型的技術革命

&#x1f604; 19年之后由于某些原因斷更了三年&#xff0c;23年重新揚帆起航&#xff0c;推出更多優質博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有堅忍不拔之志 &#x1f390; 個人CSND主頁——Mi…

HTTP報文

HTTP報文 報文流 HTTP報文是在HTTP引用程序之間發送的數據塊&#xff0c;這些數據塊以一種文本形式的元信息開頭&#xff0c;這些信息描述了報文的內容和含義&#xff0c;后面跟著可選的數據部分&#xff0c;這些報文在客戶端&#xff0c;服務器和代理之間流動。 報文流入源…

git更改本地項目關聯到新倉庫

刪除現在遠程關聯的倉庫 git remote rm origin鏈接新倉庫 git remote add origin url(需要關聯的新倉庫地址)代碼提交到遠程倉庫master分支 git push --set-upstream origin master本地分支更新同步至遠程倉庫 比如本地有dev分支 git push origin dev:dev

前端項目開發,3個HTTP請求工具

這一小節&#xff0c;我們介紹一下前端項目開發中&#xff0c;HTTP請求會用到的3個工具&#xff0c;分別是fetch、axios和js-tool-big-box中的jsonp請求。那么他們都有哪些小區別呢&#xff1f;我們一起來看一下。 目錄 1 fetch 2 axios 3 js-tool-big-box 的 jsonp 請求 …

拷貝構造、移動構造、拷貝賦值、移動賦值

最近在學習C的拷貝構造函數時發現一個問題&#xff1a;在函數中返回局部的類對象時&#xff0c;并沒有調用拷貝構造函數。針對這個問題&#xff0c;查閱了一些資料&#xff0c;這里記錄整理一下。 調用拷貝構造函數的三種情況&#xff1a; ① 用一個類去初始化另一個對象時&a…

【數據結構與算法 | 基礎篇 | 隊列篇】力扣102, 107

1. 力扣102 : 二叉樹的層序遍歷 (1). 題 給你二叉樹的根節點 root &#xff0c;返回其節點值的 層序遍歷 。 &#xff08;即逐層地&#xff0c;從左到右訪問所有節點&#xff09;。 示例 1&#xff1a; 輸入&#xff1a;root [3,9,20,null,null,15,7] 輸出&#xff1a;[[3]…

對于高速信號完整性,一塊聊聊啊(18)

本文摘錄一篇Allegro進行后仿真的完整流程,可能allegro版本有點老,但整個過程還是描述比較詳細的。 目錄 1、獲取IBIS模型 1.1模型下載 1.2檢查IBIS模型 1.3IBIS轉換為DML 1.4保存DML模型 2、仿真準備 2.1疊層設置 2.2電源網格設置 2.3仿真庫配置 3、仿真 3.1拓撲…

刷爆leetcode第六期

題目一 用隊列實現棧 請你僅使用兩個隊列實現一個后入先出&#xff08;LIFO&#xff09;的棧&#xff0c;并支持普通棧的全部四種操作&#xff08;push、top、pop 和 empty&#xff09;。 實現 MyStack 類&#xff1a; void push(int x) 將元素 x 壓入棧頂。 int pop() 移除…

【漏洞復現】大華智能物聯綜合管理平臺 fastjson遠程代碼執行漏洞

0x01 產品簡介 大華ICC智能物聯綜合管理平臺對技術組件進行模塊化和松耦合&#xff0c;將解決方案分層分級&#xff0c;提高面向智慧物聯的數據接入與生態合作能力。 0x02 漏洞概述 由于大華智能物聯綜合管理平臺使用了存在漏洞的Fastson組件,未經身份驗讓的攻擊者可利用 /e…

M功能-支付平臺(六)

target&#xff1a;離開柬埔寨倒計時-217day 今天突然發現我在csdn居然把我ip屬地搞出來了&#xff0c;之前都沒注意到&#xff0c;哎 前言 M功能演示版本做到后期(也就是第二周的后面3天)真的很心酸&#xff0c;這邊安排的4后端后面都放棄了&#xff0c;覺得做不出來&#…

ARM-V9 RME(Realm Management Extension)系統架構之系統能力的內存隔離和保護

安全之安全(security)博客目錄導讀 目錄 一、內存隔離和保護 1、顆粒PAS過濾Granular PAS filtering 2、Cache的一致性維護 2.1 物理別名點 Point of Physical Aliasing (PoPA) 2.2 加密點 3、內存(DRAM)保護 3.1 內存加密和完整性 3.2 DRAM scrubbing 本博客探討 RME…

網絡編程 —— Http使用httpClient實現頁面爬蟲

先去找類型的a標簽 取出圖片所在網址 取出https://desk.3gbizhi.com/deskMV/438.html 搭建Form界面 Http類 public static HttpClient Client { get; } static Http() {HttpClientHandler handler new HttpClientHandler();//處理消息對象//ServerCertificateCustomValidat…

安卓手機APP開發___設置鬧鐘

安卓手機APP開發___設置鬧鐘 目錄 概述 設置不精確鬧鐘 在特定時間后發出鬧鐘 在特定時間范圍內觸發鬧鐘 以大致有規律的時間間隔響起重復鬧鐘 設置精確的鬧鐘 系統會在未來的某個精確時刻調用精確鬧鐘。 可能不需要精確鬧鐘的用例 設置精確鬧鐘的方法 系統資源消耗…

萬億應急國債項目之通信指揮類應急裝備多鏈路聚合通信設備在應急行業中的重要作用

萬億應急國債項目的推出&#xff0c;無疑是我國在應急領域的一次重大舉措。在這一宏大藍圖中&#xff0c;通信指揮類應急裝備的多鏈路聚合通信設備顯得尤為重要&#xff0c;其在應急行業中所發揮的作用&#xff0c;堪稱不可或缺的關鍵一環。 通信指揮是應急響應中的核心環節&a…

QT C++ 讀寫mySQL數據庫 圖片 例子

在上篇文章中描述了怎樣搭建讀寫數據庫的環境。 本文更進一步&#xff0c;描述了讀寫mySQL數據庫&#xff0c;字符、整型數字、圖片。讀寫圖片相對難點。 數據庫的圖片字段用BLOB&#xff0c;如果圖片較大要用longblob,否則會報錯。 另外&#xff0c;讀寫數據庫都使用了短連…

Pytorch 星號*放在tensor前的作用

假如有一個多維tensor&#xff0c;名為id&#xff0c;那么*id的意思是什么呢&#xff1f; GPT答&#xff1a; 如果 id 是一個多維張量&#xff0c;那么 *id 在這種情況下會將這個多維張量解包成一個張量序列&#xff0c;其中每個元素都是一個更低維度的張量。具體來說&#x…