嵌入式的SQL程序設計


嵌入式的SQL程序設計

  1 --嵌入式SQL程序設計
  2 --SQL2005管理員大全
  3 
  4 
  5 --嵌入SQL語句的應用程序叫做宿主程序,書寫該程序的語言稱為宿主語言。
  6 --宿主語言可以是C、C++、JAVA等。嵌入的SQL語句與交互式SQL在語法上類似
  7 --但是嵌入式SQL在個別語句上有所擴充
  8 
  9 --嵌入的SQL語句主要有兩種類型:執行性SQL語句和說明性SQL語句。執行性SQL語句可用來
 10 --定義數據、查詢和操縱數據庫中的數據,每一執行性語句真正對數據庫進行操作。說明性語句
 11 --用來說明通信域和SQL語句中用到的變量。說明性語句不生成執行代碼
 12 
 13 --在C語言中使用嵌入式SQL
 14 --SQLSERVER提供對C的嵌入式語言的支持,在用於C語言的嵌入式SQL(以下簡稱ESQL/C)
 15 --大部分語法都來源於TSQL語法,只是在某些細節上略有不同。
 16 
 17 --在ESQL/C中,關鍵字和SQL語句都是不區分大小寫的,但是對於游標、連接和動態SQL語句
 18 --的定義卻是區分大小寫的,例如,以下定義的兩個游標是完全不同的
 19 
 20 DECLARE RED_CURSOR CURSOR
 21 DECLARE red_CURSOR CURSOR
 22 
 23 --1、連接到SQLSERVER
 24 --在ESQL/C中,連接到SQLSERVER用connect to語句,語法如下:
 25 CONNECT TO servername.databasename AS connection_name USER LOGIN.PASSWORD
 26 
 27 --當只有一個連接時,可以不指定連接的名稱,但是如果應用程序使用了兩個或以上的連接
 28 --,必須為每個連接指定不同的名稱。當用connect to定義了連接后,所有的后續操作都將
 29 --在當前連接上進行,如果想使用另外一個連接,就要用SET CONNECTION來改變當前的連接,語法如下:
 30 SET CONNECTION connection_name
 31 
 32 --關閉與數據的連接用DISCONNECT,可以關閉當前連接或關閉所有連接,語法如下
 33 DISCONNECT connection_name | ALL | CURRENT
 34 
 35 --例子:連接機器red上數據庫名為book和test的SQLSERVER數據庫,數據庫用戶名為sa
 36 --密碼為空,然后分別關閉他們
 37 EXEC SQL CONNECT TO red.book AS con1 USER sa;
 38 EXEC SQL CONNECT TO red.test AS con2 USER sa;
 39 EXEC SQL DISCONNECT CON1
 40 EXEC SQL DISCONNECT CON2
 41 
 42 
 43 --2、使用宿主變量
 44 --宿主變量作為標准的C變量在ESQL/C中定義,使用宿主變量可以在SQL語句中指定輸入參數或接收輸出參數
 45 --定義宿主變量的語句寫在BEGIN DECLARE SECTION和END DECLARE SECTION語句之間
 46 EXEC SQL BEGIN DECLARE SECTION
 47 INT CompanyID
 48 CHAR CompanyName[30]
 49 EXEC SQL END DECLARE SECTION
 50 
 51 --使用宿主變量時,要在宿主變量前加一個冒號作為引用宿主變量的標志
 52 "WHERE CompanyID=:CompanID"
 53 
 54 --注意:如果從數據庫中傳給宿主變量的值是NULL,那么宿主變量將會把NULL值轉換為-1處理,例如:雖然給
 55 --宿主變量Address賦予了NULL值,以下SQL語句還是不會返回Address為NULL值的記錄
 56 
 57 EXEC SQL SELECT FROM Company
 58 WHERE Address=:ADDRESS
 59 
 60 --3、使用SQL語句
 61 --在ESQL/C中有兩種SQL語句,一種是靜態SQL語句,另一種是動態SQL語句,靜態SQL語句是一個完整的SQL語句
 62 --而動態SQL語句需要在運行時指定條件變量
 63 
 64 --可以用PREPARE來定義一個動態SQL語句,語法如下:
 65 PREPARE stmt_name FROM :hvar
 66 
 67 --執行一個動態SQL語句可以用EXECUTE或EXECUTE IMMEDIATE,EXECUTE IMMEDIATE指的是
 68 --執行一個包含宿主變量中的SQL語句
 69 
 70 --可以用SELECT INTO L來把查詢結果賦予指定的宿主變量,只用於返回一條記錄的查詢語句,如果查詢
 71 --語句返回多行記錄,可以使用游標來處理
 72 
 73 --例子:構造一個動態SQL語句,插入一條記錄到COMPANY表
 74 EXEC SQL BEGIN DECLARE SECTION
 75 CHAR stmtcon[]="insert into company values(?,?)"
 76 CHAR companyid[30]
 77 CHAR companyname[30]
 78 EXEC SQL END DECLARE SECTION
 79 //提示用戶輸入數據//
 80 PRINTF("輸入單位代碼:")
 81 SCANF("%S",COMPANYID)
 82 PRINTF("輸入單位名稱:")
 83 scanf("%s",companyname)
 84 EXEC SQL PREPARE stmt FROM :stmtcon
 85 EXEC SQL EXECUTE stmt USING:COMPANYID,:COMPANYNAME
 86 
 87 --例子:把單位代碼為"0001"的單位名稱賦予給變量companname
 88 EXEC SQL BEGIN DECLARE SECTION 
 89 CHAR COMPANYNAME[30]
 90 EXEC SQL END DECLARE SECTION
 91 EXEC SQL SELECT COMPANYNAME INTO :COMPANYNAME
 92 FROM COMPANY WHERE COMPANYID='0001'
 93 
 94 --使用游標
 95 --當SQL查詢語句只返回一行時,可以用SELECT INTO 語句把返回值賦予給宿主變量
 96 --但是當查詢語句返回多行時,就不能用SELECT INTO,此時就需要游標來處理
 97 
 98 --游標分為靜態游標和動態游標,靜態游標包含完整的SQL語句,動態游標則需要在運行時指定參數
 99 --靜態游標可以包含宿主變量,當打開他時,宿主變量就被讀到SQL語句中,形成一個完整的SQL語句
100 --動態游標中的參數用?標記符來指定,當打開游標時,根據提供的?標記符代碼的數據來構造
101 --SQL語句
102 
103 --在使用游標之前必須要定義游標,定義游標語法如下
104 DECLARE cursor_name INSENSITIVE SCROLL CURSOR FOR select_stmt
105 prepare_stmt_name FOR READ_ONLY | UPDATE   |OF column_list    
106 
107 --打開游標使用open語句,用fetch語句移動打開的記錄集。對於打開的游標,可以用
108 --update來更新數據,delete來刪除數據。游標使用完后,用close語句來關閉他
109 
110 --例子:定義一個游標,返回單位信息表的所有記錄,並輸出單位信息到屏幕上
111 //定義游標,並打開//
112 EXEC SQL DECLARE C1 CURSOR FOR
113 SELECT COMPANYID,COMPANYNAME FROM COMPANY FOR BROWSE
114 EXEC SQL OPEN C1
115 //定義變量//
116 EXEC SQL BEGIN DECLARE SECTION
117 CHAR COMPANYID[30]
118 CHAR COMPANYNAME[30]
119 EXEC SQL END DECLARE SECTION
120 //輸出信息//
121 WHILE (SQLCODE==0)
122 {
123   EXEC SQL FETCH C1 INTO :COMPANYID,:COMPANYNAME
124   PRINTF("%S,%S",COMPANYID,COMPANYNAME)
125 }
126 
127 --例子:定義一個動態游標,查詢單位名稱為“北京怡神公司”的單位,返回其代碼
128 EXEC SQL BEGIN DECLARE SECTION
129 CHAR SZCOMMAND[]="SELECT COMPANYID FROM COMPANY WHERE COMPANYNAME=?";
130 CHAR SZCOMPANYNAME[]="北京怡神公司";
131 CHAR SZCOMPANYID[30]132 EXEC SQL END DECLARE SECTION
133 //定義動態游標//
134 
135 EXEC SQL
136 DECLARE CON_CURSOR CURSOR FOR SELECT_STATEMENT;
137 //准備SQL語句//
138 EXEC SQL
139 PREPARE SELECT_STATEMENT FROM :SZCOMMAND
140 //打開游標,輸出到變量中//
141 EXEC SQL OPEN CON_CURSOR USING:SZCOMPANYNAME;
142 EXEC SQL FETCH CON_CURSOR INTO:SZCOMPANYID;
143 
144 --5、使用事務
145 --ESQL/C像TSQL一樣完全支持事務管理,打開一個事務用BEGIN TRANSACTION
146 --提交事務用COMMIT TRANSACTION,回滾事務用ROLLBACK TRANSACTION
147 --事務操作只對當前連接有效
148 
149 --注意:當提交或回滾事務時,ESQL/C並不自動關閉打開的游標,可以使用
150 --SET CURSOR_CLOSE_ON_COMMIT語句設置當提交或回滾事務時自動關閉當前連接的所有打開的游標

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM