一、動態SQL概述
1. 靜態SQL vs 動態SQL
①動態SQL是相對靜態SQL而言的
②靜態SQL特點:SQL語句在程序中已經按要求寫好,只需要把一些參數通過變量傳遞給SQL語句即可
- specName = "張三";
- exec sql select ... where Sname = :specName;
③動態SQL特點:SQL語句可以在程序中動態構造,形成一個字符串
- sqltext = "delete from customers where cid = \'c006\'";
- exec sql execute immediate :sqltext;
2. 動態SQL的作用
①如編寫一個由用戶確定檢索條件的應用程序,我們就需要根據用戶輸入的條件來動態構造SQL語句(字符串)
二、動態SQL的兩種執行方式
前提:SQL語句已經被構造在宿主語言的字符串變量中
1. 立即執行語句:運行時編譯並執行
- exec sql execute immediate :字符串變量;
2. 延遲執行語句:prepare-execute-using語句
①prepare語句先編譯,編譯后的SQL語句允許有動態參數
②execute語句執行,用using語句將動態參數值傳遞給編譯好的SQL語句
- exec sql prepare sql_temp from :字符串變量;
- exec sql execute sql_temp using :動態參數;
3. 兩種執行方式的比較
①立即執行方式:
strcpy(sqltext, "delete from customers where cid = 'C01'"); // 完整的SQL語句
...
exec sql execute immediate :sqltext;
exec sql commit work;
②延遲執行方式:
strcpy(sqltext, "delete from customers where cid = :dcid"); // 帶參數的SQL語句
...
exec sql prepare delcust from :sqltext;
exec sql execute delcust using :cust_id; // cust_id值傳遞給dcid變量
exec sql commit work;
③前一種方式中,字符串變量中沒有“變量”參數,而后一種方式中,字符串變量中含有“變量”參數
三、數據字典及其作用
1. 數據字典的概念
①數據字典是系統維護的一些表或視圖的集合,這些表或視圖存儲了數據庫中各類對象的定義信息,這些信息又稱作數據庫的元數據(關於數據的數據)
②在不同的DBMS中,數據字典也被稱為系統目錄、目錄表、系統視圖等
③數據字典也是以關系的形式存儲在磁盤上的,它具有特定的數據結構(以便高效訪問內存)
2. 數據字典的內容:數據字典通常存儲的是數據庫和表的元數據,即模式本身的信息
①與關系相關的信息:關系名字、每個關系的屬性名及其類型、視圖的名字及其定義、完整性約束
②用戶與賬戶信息
③統計與描述性信息:每個關系中元組的數目
④物理文件組織信息:關系是如何存儲的(順序/無序/散列等)、關系的物理位置
⑤索引相關的信息
補:應用程序員在構造動態SQL語句時可能需要①中的信息。
3. 可能的字典數據結構
- Relation_metadata = (關系名, 屬性個數, 存儲方式, 物理位置)
- Attribute_metadata = (屬性名, 關系名, 域類型, 位置, 長度)
- User_metadata = (用戶名, 登錄密碼, 組)
- Index_metadata = (索引名, 關系名, 索引類型, 索引屬性)
- View_metadata = (視圖名, 視圖定義)
4. Oracle的數據字典
①Oracle的數據字典由視圖組成,它分為三種不同的形式,由不同的前綴標識
- USER_:用戶視圖,用戶所擁有的對象,在用戶模式中
- ALL_:擴展的用戶視圖,用戶可訪問的對象
- DBA_:DBA視圖,所有用戶都可訪問的DBA對象的子集
②如要使用Oracle數據字典中關於表的信息,Oracle定義了視圖USER_Tables、ALL_Tables和DBA_Tables
③如要使用Oracle數據字典中關於表的列的信息,Oracle定義了視圖USER_TAB_Columns、ALL_TAB_Columns...
④可以使用SQL語句來訪問如上信息:select Column_Name from ALL_TAB_Columns where ...
⑤Oracle數據字典中還定義了其他視圖,如TABLE_PRIVILEDGE、COLUMN_PRIVILEDGE、CONSTRAINT_DEFS等
5. SQLDA的概念
①SQLDA是一個內存數據結構,其內可裝載關系模式的定義信息,如列的數目、每一列的名字和類型等
②通過讀取SQLDA信息可以進行更為復雜的動態SQL的處理,不同DBMS提供的SQLDA格式並不是一致的
四、更為復雜的動態SQL:動態構造SQL語句,但欲訪問的表名和字段名是未知的
①如針對一組表,編寫由用戶確定檢索表和檢索條件的查詢程序
②要構造這樣的一個SQL語句,需要了解數據字典和SQLDA