嵌入式的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語句設置當提交或回滾事務時自動關閉當前連接的所有打開的游標