日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

嵌套SQL语句訪问DB2中SQLCA的调用技巧

發布時間:2025/4/14 数据库 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 嵌套SQL语句訪问DB2中SQLCA的调用技巧 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在IBM的關系型數據庫產品DB2中,使用SQL Communication Area(SQLCA)將程序中嵌套的SQL語句執行情況返回給程序。

在程序中有針對性地對SQLCA實施調用,可對程序中各類SQL語句的執行結果實施控制,從而避免程序的意外終止。同一時候,也能夠提高執行效率,減小系統開銷和處理時間。本文將對此作一簡要介紹。
SQLCA的結構
SQLCA的結構定義例如以下:
struc sqlca
{ ? ? ? ?unsigned char ? ? sqlcaid[8];
long ? ? ? ? ? ? ?sqlabc;
long ? ? ? ? ? ? ?sqlcode;
short ? ? ? ? ? ? sqlerrml;
unsigned char ? ? sqlerrnmc[10];
unsigned char ? ? sqlerrp[8];
long ? ? ? ? ? ? ?sqlerrd[6];
unsigned char ? ? sqlwarn[21];
unsigned char ? ? sqlstate[5]; ? ? ? ?}
結構中各個域各有不同的含義和用途。部分域的功能和用途將在下面各小節中做具體探討,其他一些域的含義例如以下:
sqlcaid: ? ? ? ?標識性域。包括字符串“sqlca”.
Sqlabc: ? ? ? ?包括sqlca結構的長度。
Sqlerrml: ? ? ? ?包括sqlerrmc域中數據的實際長度。
Sqlerrmc: ? ? ? ? 由0或多個字串組成,它對返回的值給以一個更具體的解釋。如返回的代碼表示表沒找到,則此域中包括未找到的表名。
Sqlerrp: ? ? ? ? 包括一些對用戶沒用的論斷信息。
Sqlstate: ? ? ? ? 長度為5的字符串,它指示SQL語句的查詢結果。

與sqlca不同的是,它遵循ANSI/ISOSQL92的標準,所以,雖然不同數據庫產品的sqlca結構中sqlcode域的含義不同。但sqlstate域的含義是同樣的。


調用方法
DB2通過一個函數:sqlaintp。能夠方便地讀取sqlca中SQL語句運行后的結果和錯誤。此函數定義在sql.h中,可通過下述語句實現對其定義:
EXEC SQL INCLUDE sqlca.h?
Sqlaintp函數格式例如以下:
int sqlaintp
( ? ? ? ?char ?*buffer
short ? buffer_size
short ? line_width
struct ?sqlca *sqlca ? ? ? ?)
當中, buffer為存放了sqlca信息的緩沖區;buffer_size中存放了buffer的長度;line_width存放了兩個運行符之間的字符長度。

函數返回值為正時代表sqlca信息的長度,為負時代表沒有sqlca信息返回。一般來講,sqlca信息都可存放在長度為512個字節的緩沖區中。
為了處理各種錯誤情況,DB2提供了WHENEVER語句。其詳細用法例如以下:
(1) ? ? ? ?EXEC SQL WHENEVER SQLERROR action ? ? ? SQLCODE<0時,運行action.
(2) EXEC SQL WHENEVER SQLWARNING action ? ? SQLCODE>;0但不為100且SQLWARN[0]=W時時,運行action.
(3) EXEC SQL WHENEVER NOT FOUND action ? ? ?SQLCODE=100時,運行action.
當中action有兩種可能:
CONTINUE:繼續運行程序中的還有一條命令。
GO TO label:轉到label指定的語句開始。
值得注意的是,WHENEVER語句的作用范圍到下一個WHENEVER時終止。


對SQLCODE的調用
? ?在對SQLCA的調用中,最常見的就是通過訪問SQLCODE來實現的。

非常多程序猿甚至在每條SQL語句運行完成后都設置檢查SQLCODE返回值的代碼,以對程序的運行進行監控。當返回值為+0的時。表明SQL語句運行成功。返回值為+100時,表明滿足檢索條件的記錄沒找到。

一般來說。負的SQLCODE返回負值意味著SQL語句運行失敗,程序猿可在程序中實現依據不同的SQLCODE返回值,採取不同的程序流程以實現錯誤控制。比如。當SQLCODE的返回值為-911時, 表明系統檢測到了死鎖(Dead Lock),程序猿可針對這樣的情況採取下面兩種處置方法:
(1)設置循環,重復運行查詢請求并檢測SQLCODE,直至返回值為+0(運行成功)。
(2)設置一個計數器,運行查詢請求到一定次數后終止程序或向用戶發出警報。


值得注意的是,為了保證數據的完整性。有時須要針對返回的錯誤類型對數據庫進行回滾(ROLLBACK)操作,且回滾的起點不一定是未運行成功的SQL語句導致系統所處于的狀態?;貪L的起點與SQL語句的嵌套類型(動態,靜態。復合式)以及錯誤類型都有關系。

尤其是后者,由于有些錯誤類型會導致系統作一個隱式的回滾(比如SQLCODE -911),從而使回滾的起點推斷更為復雜。
? ?雖然多數情況下我們希望SQL語句運行成功,但有些時候。通過一個有益“制造”的負的SQLCODE返回值,能夠使程序中的邏輯推斷更為簡潔。還可在較大程度上降低系統開銷。我們能夠設想這樣一種情況:郵電局有兩種話費收據,一種是針對僅僅安有一部電話的用戶的,還有一種是針對安有多部電話的用戶的,兩種話費收據上的項目個不同樣,須要不同的子程序進行處理。在話費收據處理程序中,首先依據每個用戶唯一的ID號檢索相應的電話號碼。并設置計數器對檢索到的記錄數(安裝電話數)進行統計,當某用戶ID僅相應一條電話號碼記錄時。調用單機用戶話費收據處理程序對相應用戶的話費數據進行處理;當某用戶ID僅相應多條電話號碼記錄時,調用多機用戶話費收據處理程序對相應用戶的話費數據進行處理。不管何種情況。都需對用戶的數據又一次進行讀取方可進行下一步處理。也就是說,須要對一個用戶的電話數據進行兩次讀取才干完畢相應的數據處理。這無疑會極大的添加系統處理時間。

通過對SQLCODE的調用。能夠使這樣的情況得以顯著改善。首先。針對每個用戶的ID作一個SELECT操作,然后檢查SQLCODE返回值,當返回值為+0時,表明該用戶僅僅安裝了一部電話;當返回值為-811時。表明該用戶安裝了不止一部電話??捎纱送茢鄳赡欠N程序來處理用戶話費信息。採用這樣的解決方式,僅僅對用戶的數據讀取一次就可完畢用戶的話費處理。差點兒降低了一半的系統處理時間。

與其他諸如改變表的結構等方法。此種方法對系統的修改最小。而且簡便易行。效果明顯。


? ?在對數據庫訪問的程序中,程序通常要求實現例如以下功能:更新數據庫中的某一條記錄,當這條記錄不存在時創建對應的記錄。

比較常見的做法是,先進行一次SELECT查詢,當SQLCODE返回+0時,表明此條記錄已存在,然后再重讀此記錄對其進行UPDATE操作;當SQLCODE返回+100時,表明對應記錄不存在,接下來再進行INSTER操作。還有一種實現方岸依據數據訪問的特點,當對數據的更新多于新值插入時。直接進行UPDATE操作。當SQLCODE返回+0時更新成功,反之。返回+100時,需對其進行INSERT操作。當新值插入要多余于更新操作時。首先進行INSERT操作。SQLCODE值為+0時插入成功,否則返回-803,表明原記錄已存在,須要進行UPDATE操作。顯而易見,多數情況下,另外一種方法僅僅需對數據進行一次操作就可以,從而提高系統的處理效率。
對SQLWARN的調用
? ?雖然程序猿通??偸呛雎許QL的警告錯誤。但適當的使用能夠幫助程序檢測到各種潛在的錯誤,而且能夠使編程更加簡潔。

因此,此類警告信息亦應受到程序猿的重視。
? ?警告信息在SQLCA中有兩種表示方法。

每個除了+100以外的SQLCODE正返回值都代表一定的警告信息;同一時候,SQLCA中的SQLWARN[n](n=1,2,3,4。5。6或A)返回值也代表著對應的警告信息。當系統發現警告錯誤時,系統會以這兩種方式通知程序。

此時。查詢可能會返回一些結果。但此時的結果極有可能是錯誤或不完整的。當SQLWARN[O]=W時。DB2提供了幫助用戶推斷詳細警告類型的信息,其對應值及含義例如以下表:


SQLCA值 ? ? ? ?返回值 ? ? ? ?警告內容
SQLWARN[1] ? ? ? ?W ? ? ? ?序主變量長度不夠而發生截取
SQLWARN[2] ? ? ? ?W ? ? ? ?字段功能處理的數據中有空(NULL)值
SQLWARN[3] ? ? ? ?W ? ? ? ?返回字段個數大于程序定義的序主變量個數
SQLWARN[4] ? ? ? ?W ? ? ? ?在UPDATE或DELETE操作中未指定WHERE條件
SQLWARN[6] ? ? ? ?W ? ? ? ?對時間數據進行數學運算后進行修正
SQLWARN[A] ? ? ? ?W ? ? ? ?轉換出錯
? ? ? ?如果某學校要計算某一學期各班。各科。個人的平均成績。

當中。個人平均成績=(個人總分)/(本學期所學科目數)。

因為工作人員疏忽,誤將某一同學的學期學習科目輸為0。

在使用嵌套SQL語句的程序對相關數據進行處理時,SQLCODE返回值為-802(除數為零)導致程序終止執行。雖然用戶知道可能是某一項數據錯誤,但無法知道詳細是哪一項數據錯誤。對于一個擁有較多數據的學校來說,查找起來是非常費事的。

通過下述辦法能夠非常好的解決這一問題:在定義代表計算結果的序主變量的同一時候,為其指定一個能夠為空的指示變量,如 :AVGRD :IND代表序主變量為AVGRD,指示變量為IND。此時發生被零除錯誤時,指示變量值被設為-2,同一時候SQLCODE返回值為+802警告信息。

程序捕捉到此信息時,可向用戶提供對應的信息,幫助用戶確定出錯數據位置。
? ?當SQLWARN[O]的值為W時,表明系統檢測到警告錯誤。此時系統提供的警告信息也可被程序猿所利用。比方:當程序把一個表中的某一字符型字段值傳入一個比其長度要短的序主變量中時,發生字符截取。雖然此時SQLCODE會返回+0,但程序獲取的數據是不完整的。通過為序主變量指定一個指示變量。發生相同錯誤時,SQLWARN[O]和SQLWARN[1]的返回值都為W。同一時候,指示變量被賦給了字段中數據的實際長度。此種方法甚至能夠用來推斷表中字段中字符串數據的實際長度。
對SQLERRD數組的調用
? ? SQLERRD是SQLCA中代表SQL查詢執行結果的一個數組。數組中的不同元素有不同的含義。

當中較經常使用的是SQLERRD[3]。它將返回程序中上一次INSERT,UPDATE或DELETE操作所影響到的記錄數。否則。程序須要借助一定的循環來統計被以上操作影響到的記錄數。但值得注意的是。在執行DELETE操作時。假設相關字段的刪除類型被設為CASCADE而導致被刪除其他記錄數不會被包括在內;同一時候,假設在DELETE語句中未指定WHERE條件,則SQLERRD[3]的返回值為-1。以上兩點在使用此數組時應予以注意。SQLERRD中各元素的含義以及其對于復合式SQL語句。連接方法的不同含義例如以下:
SQLERRD元素 ? ? ? ?表示意義 ? ? ? ?復合式SQL語句 ? ? ? ?連接方式
SQLERRD[2] ? ? ? ?保存當前SQL語句處理的行數。但若當前SQL失敗, 則無定義; 若在數組操作中出錯, 則停于出錯行, 這時給出成功處理的行數; OPEN 運行后, 清為0, FECTH 后增值(原有值+上本次fetch的行數); EXECUTE、INSERT、UPDATE、SELETE和SELECT后, 為成功處理的行數。
SQLERRD[3] ? ? ? ?返回的記錄數(預計)及INSERT/UPDATE或DELETE操作所影響到的記錄數(不包括因限制條件而影響到的記錄) ? ? ? ? ? 總語句數 ? ? ? ? 0:由底層客戶機的一段式提交托付確認1:一段式提交2:一段式僅僅讀提交3:兩段式提交
SQLERRD[4] ? ? ? ?指出語句中出錯的位移, 首字符位移為0。


SQLERRD[5] ? ? ? ?INSERT/UPDATE或DELETE操作所影響到的記錄數(包括因限制條件而影響到的記錄) ? ? ? ?因限制條件而影響到的記錄數 ? ? ? ?無

經常使用:SQLERRD[2] ?,如:#define SQLROWS sqlca.sqlerrd[2]


? ? DB2支持多種高級語言(包含當前極為流行的C和C++等)通過嵌套SQL語句對其上的數據進行訪問。同一時候,因為對多種嵌套(動態,靜態,復合式)方式的支持,更加增強了訪問的靈活性。

通過在程序中調用SQLCA。可對程序中嵌套的SQL語句的執行結果進行控制。增強了程序的可靠性。防止程序意外終止。也可使程序的編寫更加簡潔。提高程序的執行效率,縮短系統的處理時間。

轉載于:https://www.cnblogs.com/blfbuaa/p/6760722.html

總結

以上是生活随笔為你收集整理的嵌套SQL语句訪问DB2中SQLCA的调用技巧的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。