『数据库』数据库编程(概念性的东西,应用一般,甚至有点过时,用来考试)
數據庫從入門到精通:戳我
嵌入式SQL
SQL語言提供了兩種不同的使用方式
- 交互式
- 嵌入式
為什么要引入嵌入式SQL
- SQL語言是非過程性語言
- 事務處理應用需要高級語言
這兩種方式細節上有差別,在程序設計的環境下,SQL語句要做某些必要的擴充
一、嵌入式SQL的處理過程
主語言
- 嵌入式SQL是將SQL語句嵌入程序設計語言中,被嵌入的程序設計語言,如C、C++、Java,稱為宿主語言,簡稱主語言。
處理過程
- 預編譯方法
為了區分SQL語句與主語言語句,所有SQL語句必須加前綴EXEC SQL,
主語言為C語言時,語句格式:
二、嵌入式SQL語句與主語言之間的通信
將SQL嵌入到高級語言中混合編程,程序中會含有兩種不同計算模型的語句
1.SQL語句
- 描述性的面向集合的語句
- 負責操縱數據庫
2.高級語言語句
- 過程性的面向記錄的語句
- 負責控制邏輯流程
3.數據庫工作單元與源程序工作單元之間的通信
(1)向主語言傳遞SQL語句的執行狀態信息,使主語言能夠據此控制程序流程,主要用SQL通信區實現
(2)主語言向SQL語句提供參數,主要用主變量實現
(3)將SQL語句查詢數據庫的結果交主語言處理,主要用主變量和游標實現
4.SQLCA: SQL Communication Area
SQLCA是一個數據結構
(1)SQLCA的用途
- SQL語句執行后,系統反饋給應用程序信息
描述系統當前工作狀態
描述運行環境 - 這些信息將送到SQL通信區中
- 應用程序從SQL通信區中取出這些狀態信息,據此決定接下來執行的語句
(2)SQLCA使用方法
- 定義SQLCA
用EXEC SQL INCLUDE SQLCA定義 - 使用SQLCA
a. SQLCA中有一個存放每次執行SQL語句后返回代碼的變量SQLCODE
b. 如果SQLCODE等于預定義的常量SUCCESS,則表示SQL語句成功,否則表示出錯
c. 應用程序每執行完一條SQL 語句之后都應該測試一下SQLCODE的值,以了解該SQL語句執行情況并做相應處理
5.主變量
- 嵌入式SQL語句中可以使用主語言的程序變量來輸入或輸出數據
- 在SQL語句中使用的主語言程序變量簡稱為主變量 (Host Variable)
主變量的類型
- 輸入主變量
由應用程序對其賦值,SQL語句引用 - 輸出主變量
由SQL語句對其賦值或設置狀態信息,返回給應用程序
6.指示變量
- 是一個整型變量,用來“指示”所指主變量的值或條件
- 一個主變量可以附帶一個指示變量(Indicator Variable)
- 指示變量的用途
指示輸入主變量是否為空值
檢測輸出變量是否為空值,值是否被截斷
7.在SQL語句中使用主變量和指示變量的方法
(1)說明主變量和指示變量
BEGIN DECLARE SECTION...... (說明主變量和指示變量)... END DECLARE SECTION(2)使用主變量
- 說明之后的主變量可以在SQL語句中任何一個能夠使用表達式的地方出現
- 為了與數據庫對象名(表名、視圖名、列名等)區別,SQL語句中的主變量名前要加冒號(:)作為標志
(3)使用指示變量
- 指示變量前也必須加冒號標志
- 必須緊跟在所指主變量之后
(4)在SQL語句之外(主語言語句中)使用主變量和指示變量的方法:
可以直接引用,不必加冒號
8.使用游標的原因
- SQL語言與主語言具有不同數據處理方式
- SQL語言是面向集合的,一條SQL語句原則上可以產生或處理多條記錄
- 主語言是面向記錄的,一組主變量一次只能存放一條記錄
- 僅使用主變量并不能完全滿足SQL語句向應用程序輸出數據的要求
- 嵌入式SQL引入了游標的概念,用來協調這兩種不同的處理方式
9.游標
- 游標是系統為用戶開設的一個數據緩沖區,存放SQL語句的執行結果
- 每個游標區都有一個名字
- 用戶可以用SQL語句逐一從游標中獲取記錄,并賦給主變量,交由主語言進一步處理
(1)建立數據庫連接
EXEC SQL CONNECT TO target[AS connection-name][USER user-name]; target是要連接的數據庫服務器 a.常見的服務器標識串,如<dbname>@<hostname>:<port> b.包含服務器標識的SQL串常量 c.DEFAULT d.connect-name是可選的連接名,連接名必須是一個有效的標識符 e.在整個程序內只有一個連接時可以不指定連接名 f.程序運行過程中可以修改當前連接 EXEC SQL SET CONNECTION connection-name|DEFAULT;(2)關閉數據庫連接
EXEC SQL DISCONNECT [connection];舉個例子
依次檢查某個系的學生記錄,交互式更新某些學生年齡。
三、不用游標的SQL語句
(1)不用游標的SQL語句的種類
- 說明性語句
- 數據定義語句
- 數據控制語句
- 查詢結果為單記錄的SELECT語句
- 非CURRENT形式的增刪改語句
這類語句不需要使用游標,只需用INTO子句指定存放查詢結果的主變量。
[例] 根據學生號碼查詢學生信息。 EXEC SQL SELECT Sno,Sname,Ssex,Sage,Sdept INTO:Hsno,:Hname,:Hsex,:Hage,:HdeptFROM StudentWHERE Sno=:givensno; /*把要查詢的學生的學號賦給為了主變量givensno*/- INTO子句、WHERE子句和HAVING短語的條件表達式中均可以使用主變量
- 查詢返回的記錄中,可能某些列為空值NULL
- 如果查詢結果實際上并不是單條記錄,而是多條記錄,則程序出錯,關系數據庫管理系統會在SQLCA中返回錯誤信息
- 在UPDATE的SET子句和WHERE子句中可以使用主變量,SET子句還可以使用指示變量
四、使用游標的SQL語句
1.必須使用游標的SQL語句
- 查詢結果為多條記錄的SELECT語句
- CURRENT形式的UPDATE語句
- CURRENT形式的DELETE語句
2.使用游標的步驟
(1)說明游標
(2)打開游標
(3)推進游標指針并取當前記錄
(4)關閉游標
3.使用DECLARE語句
(1)語句格式
(2)功能
- 是一條說明性語句,這時關系數據庫管理系統并不執行SELECT語句
4.使用OPEN語句
(1)語句格式
(2)功能
- 打開游標實際上是執行相應的SELECT語句,把查詢結果取到緩沖區中
- 這時游標處于活動狀態,指針指向查詢結果集中的第一條記錄
5.使用FETCH語句
(1)語句格式
(2)功能
- 指定方向推動游標指針,同時將緩沖區中的當前記錄取出來送至主變量供主語言進一步處理
6.使用CLOSE語句
(1)語句格式
(2)功能
- 關閉游標,釋放結果集占用的緩沖區及其他資源
(3)說明
- 游標被關閉后,就不再和原來的查詢結果集相聯系
- 被關閉的游標可以再次被打開,與新的查詢結果相聯系
7.CURRENT形式的UPDATE語句和DELETE語句的用途
(1)非CURRENT形式的UPDATE語句和DELETE語句
- 面向集合的操作
- 一次修改或刪除所有滿足條件的記錄
(2)如果只想修改或刪除其中某個記錄
- 用帶游標的SELECT語句查出所有滿足條件的記錄
- 從中進一步找出要修改或刪除的記錄
- 用CURRENT形式的UPDATE語句和DELETE語句修改或刪除之
- UPDATE語句和DELETE語句中要用子句
表示修改或刪除的是最近一次取出的記錄,即游標指針指向的記錄
8.不能使用CURRENT形式的UPDATE語句和DELETE語句
- 當游標定義中的SELECT語句帶有UNION或ORDER BY子句
- 該SELECT語句相當于定義了一個不可更新的視圖
五、動態SQL
靜態嵌入式SQL
- 靜態嵌入式SQL語句能夠滿足一般要求
- 無法滿足要到執行時才能夠確定要提交的SQL語句、查詢的條件
動態嵌入式SQL
- 允許在程序運行過程中臨時“組裝”SQL語句
- 支持動態組裝SQL語句和動態參數兩種形式
1. 使用SQL語句主變量
- 程序主變量包含的內容是SQL語句的內容,而不是原來保存數據的輸入或輸出變量
- SQL語句主變量在程序執行期間可以設定不同的SQL語句,然后立即執行
2. 動態參數
動態參數
- SQL語句中的可變元素
- 使用參數符號(?)表示該位置的數據在運行時設定
和主變量的區別
- 動態參數的輸入不是編譯時完成綁定
- 而是通過 PREPARE語句準備主變量和執行語句EXECUTE綁定數據或主變量來完成
使用動態參數的步驟
(1)聲明SQL語句主變量
(2)準備SQL語句(PREPARE)
3. 執行準備好的語句(EXECUTE)
過程化SQL
一、過程化SQL的塊結構
1.過程化SQL
- SQL的擴展
- 增加了過程化語句功能
- 基本結構是塊
塊之間可以互相嵌套
每個塊完成一個邏輯操作
2.過程化SQL塊的基本結構
(1)定義部分
- 定義的變量、常量等只能在該基本塊中使用
- 當基本塊執行結束時,定義就不再存在
(2)執行部分
二、變量和常量的定義
1. 變量定義
2. 常量定義
常量名 數據類型 CONSTANT :=常量表達式常量必須要給一個值,并且該值在存在期間或常量的作用域內不能改變。如果試圖修改它,過程化SQL將返回一個異常
3. 賦值語句
三、流程控制
過程化SQL功能
1. 條件控制語句
IF-THEN,IF-THEN-ELSE和嵌套的IF語句
(1)
(2)
IF condition THENSequence_of_statements1; ELSESequence_of_statements2; END IF;(3)在THEN和ELSE子句中還可以再包含IF語句,即IF語句可以嵌套
2. 循環控制語句
LOOP,WHILE-LOOP和FOR-LOOP
(1)簡單的循環語句LOOP
多數數據庫服務器的過程化SQL都提供EXIT、BREAK或LEAVE等循環結束語句,保證LOOP語句塊能夠結束。
(2)WHILE-LOOP
- 每次執行循環體語句之前,首先對條件進行求值
- 如果條件為真,則執行循環體內的語句序列
- 如果條件為假,則跳過循環并把控制傳遞給下一個語句
(3)FOR-LOOP
FOR count IN [REVERSE] bound1 … bound2 LOOPSequence_of_statements; END LOOP;3. 錯誤處理
- 如果過程化SQL在執行時出現異常,則應該讓程序在產生異常的語句處停下來,根據異常的類型去執行異常處理語句
- SQL標準對數據庫服務器提供什么樣的異常處理做出了建議,要求過程化SQL管理器提供完善的異常處理機制
存儲過程和函數
一、存儲過程
過程化SQL塊類型
- 命名塊
編譯后保存在數據庫中,可以被反復調用,運行速度較快,過程和函數是命名塊 - 匿名塊
每次執行時都要進行編譯,它不能被存儲到數據庫中,也不能在其他過程化SQL塊中調用
1.存儲過程
由過程化SQL語句書寫的過程,經編譯和優化后存儲在數據庫服務器中,使用時只要調用即可。
2.存儲過程的優點
- 運行效率高
- 降低了客戶機和服務器之間的通信量
- 方便實施企業規則
3.存儲過程的用戶接口
- 創建存儲過程
- 執行存儲過程
- 修改存儲過程
- 刪除存儲過程
二、函數
函數和存儲過程的異同
- 同:都是持久性存儲模塊
- 異:函數必須指定返回的類型
1. 函數的定義語句格式
CREATE OR REPLACE FUNCTION 函數名 ([參數1,參數2,…]) RETURNS <類型> AS <過程化SQL塊>;2. 函數的執行語句格式
CALL/SELECT 函數名 ([參數1,參數2,…]);3. 修改函數
重命名
重新編譯
ALTER FUNCTION 過程名 COMPILE;ODBC編程
ODBC優點
- 移植性好
- 能同時訪問不同的數據庫
- 共享多個數據資源
一、ODBC概述
1.ODBC產生的原因
- 由于不同的數據庫管理系統的存在,在某個關系數據庫管理系統下編寫的應用程序就不能在另一個關系數據庫管理系統下運行
- 許多應用程序需要共享多個部門的數據資源,訪問不同的關系數據庫管理系統
2.ODBC
- 是微軟公司開放服務體系(Windows Open Services Architecture,WOSA)中有關數據庫的一個組成部分
- 提供了一組訪問數據庫的應用程序編程接口(Application Programming Interface,API )
3.ODBC約束力
- 規范應用開發
- 規范關系數據庫管理系統應用接口
二、ODBC工作原理概述
1.ODBC應用系統的體系結構
(1)用戶應用程序
(2)ODBC驅動程序管理器
(3)數據庫驅動程序
(4)數據源
2.ODBC應用程序包括的內容
- 請求連接數據庫
- 向數據源發送SQL語句
- 為SQL語句執行結果分配存儲空間,定義所讀取的數據格式
- 獲取數據庫操作結果或處理錯誤
- 進行數據處理并向用戶提交處理結果
- 請求事務的提交和回滾操作
- 斷開與數據源的連接
3.驅動程序管理器:用來管理各種驅動程序
- 包含在ODBC32.DLL中
- 管理應用程序和驅動程序之間的通信
- 建立、配置或刪除數據源,并查看系統當前所安裝的數據庫ODBC驅動程序
4.主要功能
- 裝載ODBC驅動程序
- 選擇和連接正確的驅動程序
- 管理數據源
- 檢查ODBC調用參數的合法性
- 記錄ODBC函數的調用等
5.ODBC通過驅動程序來提供應用系統與數據庫平臺的獨立性
6.ODBC應用程序不能直接存取數據庫
- 其各種操作請求由驅動程序管理器提交給某個關系數據庫管理系統的ODBC驅動程序
- 通過調用驅動程序所支持的函數來存取數據庫
- 數據庫的操作結果也通過驅動程序返回給應用程序
- 如果應用程序要操縱不同的數據庫,就要動態地鏈接到不同的驅動程序上
7.ODBC驅動程序類型
單束
- 數據源和應用程序在同一臺機器上
- 驅動程序直接完成對數據文件的I/O操作
- 驅動程序相當于數據管理器
多束
- 支持客戶機—服務器、客戶機—應用服務器/數據庫服務器等網絡環境下的數據訪問
- 由驅動程序完成數據庫訪問請求的提交和結果集接收
- 應用程序使用驅動程序提供的結果集管理接口操縱執行后的結果數據
8.數據源:是最終用戶需要訪問的數據,包含了數據庫位置和數據庫類型等信息,是一種數據連接的抽象
數據源對最終用戶是透明的
- ODBC給每個被訪問的數據源指定唯一的數據源名(Data Source Name,簡稱DSN),并映射到所有必要的、用來存取數據的低層軟件
- 在連接中,用數據源名來代表用戶名、服務器名、所連接的數據庫名等
- 最終用戶無須知道數據庫管理系統或其他數據管理軟件、網絡以及有關ODBC驅動程序的細節
三、ODBC API 基礎
ODBC 應用程序編程接口的一致性
API一致性
- 包含核心級、擴展1級、擴展2級
語法一致性
- 包含最低限度SQL語法級、核心SQL語法級、擴展SQL語法級
1. 函數概述
ODBC 3.0 標準提供了76個函數接口
- 分配和釋放環境句柄、連接句柄、語句句柄
- 連接函數(SQLDriverconnect等)
- 與信息相關的函數(SQLGetinfo、SQLGetFuction等)
- 事務處理函數(如SQLEndTran)
- 執行相關函數(SQLExecdirect、SQLExecute等)
- 編目函數,ODBC 3.0提供了11個編目函數,如SQLTables、SQLColumn等。應用程序可以通過對編目函數的調用來獲取數據字典的信息,如權限、表結構等。
2. 句柄及其屬性
句柄是32位整數值,代表一個指針 。
ODBC 3.0中句柄分類
- 環境句柄
- 連接句柄
- 語句句柄
- 描述符句柄
應用程序句柄之間的關系
- 每個ODBC應用程序需要建立一個ODBC環境,分配一個環境句柄,存取數據的全局性背景,如環境狀態、當前環境狀態診斷、當前在環境上分配的連接句柄等
- 一個環境句柄可以建立多個連接句柄,每一個連接句柄實現與一個數據源之間的連接
- 在一個連接中可以建立多個語句句柄,它不只是一個SQL語句,還包括SQL語句產生的結果集以及相關的信息等
- 在ODBC 3.0中又提出了描述符句柄的概念,它是描述SQL語句的參數、結果集列的元數據集合
3. 數據類型
- ODBC數據類型
SQL數據類型:用于數據源
C數據類型 :用于應用程序的C代碼 - 應用程序可以通過SQLGetTypeInfo來獲取不同的驅動程序對于數據類型的支持情況
- SQL數據類型和C數據類型之間的轉換規則
四、ODBC的工作流程
1. 配置數據源
方法:
- 運行數據源管理工具來進行配置
- 使用Driver Manager 提供的ConfigDsn函數來增加、修改或刪除數據源
創建數據源—第一步:定義句柄和變量
- 沒有和具體的驅動程序相關聯,由Driver Manager來進行控制 ,并配置環境屬性
- 應用程序通過調用連接函數和某個數據源進行連接后,Driver Manager才調用所連的驅動程序中的SQLAllocHandle,來真正分配環境句柄的數據結構
創建數據源—第二步:初始化環境
- 應用程序調用SQLAllocHandle分配連接句柄,通過SQLConnect、SQLDriverConnect或SQLBrowseConnect與數據源連接
- SQLConnect連接函數的輸入參數為:
配置好的數據源名稱
用戶ID
口令
創建數據源—第三步:建立連接
- 處理任何SQL語句之前,應用程序還需要首先分配一個語句句柄
- 語句句柄含有具體的SQL語句以及輸出的結果集等信息
- 應用程序還可以通過SQLtStmtAttr來設置語句屬性(也可以使用默認值)
創建數據源—第四步
- 應用程序處理SQL語句的兩種方式
預處理(SQLPrepare、SQLExecute適用于語句的多次執行)
直接執行(SQLExecdirect) - 如果SQL語句含有參數,應用程序為每個參數調用SQLBindParameter,并把它們綁定至應用程序變量
- 應用程序可以直接通過改變應用程序緩沖區的內容從而在程序中動態改變SQL語句的具體執行
- 應用程序根據語句類型進行的處理
有結果集的語句(select或是編目函數),則進行結果集處理
沒有結果集的函數,可以直接利用本語句句柄繼續執行新的語句或是獲取行計數(本次執行所影響的行數)之后繼續執行 - 在插入數據時,采用了預編譯的方式,首先通過SQLPrepare來預處理SQL語句,然后將每一列綁定到用戶緩沖區
創建數據源—第五步:執行SQL語句
- 應用程序可以通過SQLNumResultCols來獲取結果集中的列數
- 通過SQL DescribeCol或SQLColAttrbute函數來獲取結果集每一列的名稱、數據類型、精度和范圍
- ODBC中使用游標來處理結果集數據
- ODBC中游標類型
Forward-only游標,是ODBC的默認游標類型
可滾動(Scroll)游標:靜態(static)、動態(dynamic)、碼集驅動(keyset-driven)、混合型(mixed)
結果集處理步驟
- ODBC游標的打開方式不同于嵌入式SQL,不是顯式聲明而是系統自動產生一個游標,當結果集剛剛生成時,游標指向第一行數據之前
- 應用程序通過SQLBindCol把查詢結果綁定到應用程序緩沖區中,通過SQLFetch或是SQLFetchScroll來移動游標獲取結果集中的每一行數據
- 對于如圖像這類特別的數據類型,當一個緩沖區不足以容納所有的數據時,可以通過SQLGetdata分多次獲取
- 最后通過SQLClosecursor來關閉游標
創建數據源—第六步:結果集處理
應用程序中止步驟
- 釋放語句句柄
- 釋放數據庫連接
- 與數據庫服務器斷開
- 釋放ODBC環境
創建數據源—第七步:中止處理
2. 初始化環境
3. 建立連接
4. 分配語句句柄
5. 執行SQL語句
6. 結果集處理
7. 中止處理
總結
以上是生活随笔為你收集整理的『数据库』数据库编程(概念性的东西,应用一般,甚至有点过时,用来考试)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 『数据库』数据库系统效率Max--数据库
- 下一篇: 三星 Galaxy Buds 2 无线耳