動態(tài)SQL的概念
靜態(tài)SQL特點:SQL語句在程序中已經(jīng)按要求寫好,只需要把一些參數(shù)通過變量(高級語言程序語句中不帶冒號) 傳送給嵌入式SQL語句即可(嵌入式SQL語句中帶冒號)
例如:
SpecName = ‘張三’;
exec sql select Sno, Sname, Sclass into :vSno, :vSname, :vSclass from
Student where Sname= :SpecName ;
動態(tài)SQL特點:SQL語句可以在程序中動態(tài)構(gòu)造蝌麸,形成一個字符串回右,然后再交給DBMS執(zhí)行凹耙,交給DBMS執(zhí)行時仍舊可以傳遞變量
動態(tài)的構(gòu)造SQL的字符串, 然后執(zhí)行...
動態(tài)SQL的執(zhí)行方式
- 立即執(zhí)行語句: 運行時編譯并運行
EXEC SQL EXECUTE IMMEDIATE :host-variable; - Prepare-Execute-Using語句: PREPARE語句先編譯署驻,編譯后的SQL語句允許動態(tài)參數(shù),EXECUTE語句執(zhí)行站超,用USING語句將動態(tài)參數(shù)值傳送給編譯好的SQL語句
EXEC SQL PREPARE sql_temp FROM :host-variable;
...
EXEC SQL EXECUTE sql_temp USING :cond-variable
數(shù)據(jù)字典與SQLDA
數(shù)據(jù)字典(Data dictionary)斤程,又稱為系統(tǒng)目錄(System Catalogs)
- 是系統(tǒng)維護的一些表或視圖的集合, 這些表或視圖存儲了數(shù)據(jù)庫中各類對象的定義信息, 這些對象包括用Create語句定義的表角寸、列、索引忿墅、視圖扁藕、權(quán)限、約束等, 這些信息又稱數(shù)據(jù)庫的元數(shù)據(jù)--關(guān)于數(shù)據(jù)的數(shù)據(jù)
- 不同DBMS術(shù)語不一樣: 數(shù)據(jù)字典(Data Dictionary(Oracle))疚脐、目錄表(DB2 UDB)亿柑、系統(tǒng)目錄(INFORMIX)、系統(tǒng)視圖(X/Open)
- 不同DBMS中系統(tǒng)目錄存儲方式可能是不同的, 但會有一些信息對DBA公開. 這些公開的信息, DBA可以使用一些特殊的SQL命令來檢索
數(shù)據(jù)字典的內(nèi)容構(gòu)成
數(shù)據(jù)字典通常存儲的是數(shù)據(jù)庫和表的元數(shù)據(jù), 即模式本身的信息:
------程序員需要知道這些信息------
- 與關(guān)系相關(guān)的信息
- 關(guān)系名字
- 每一個關(guān)系的屬性名及其類型
- 視圖的名字及其定義
- 完整性約束
- 用戶與賬戶信息, 包括密碼
- 統(tǒng)計與描述性數(shù)據(jù): 如每個關(guān)系中元組的數(shù)目
------數(shù)據(jù)庫管理系統(tǒng)實現(xiàn)算法需要用到這些信息------
- 物理文件組織信息:
- 關(guān)系是如何存儲的(順序/無序/散列等)
- 關(guān)系的物理位置
- 索引相關(guān)的信息
數(shù)據(jù)字典的結(jié)構(gòu):
- 也是存儲在磁盤上的關(guān)系
- 專為高效訪問設(shè)計的特定的數(shù)據(jù)結(jié)構(gòu)
不同的DBMS, 有不同的定義. 例如:
SQLDA
SQL Descriptor Area, SQL描述符區(qū)域.
- SQLDA是一個內(nèi)存數(shù)據(jù)結(jié)構(gòu)棍弄,內(nèi)可裝載關(guān)系模式的定義信息望薄,如列的數(shù)目,每一列的名字和類型等等.
- 通過讀取SQLDA信息可以進行更為復(fù)雜的動態(tài)SQL的處理
- 不同DBMS提供的SQLDA格式并不是一致的
ODBC簡介
ODBC(Open DataBase Connection)是一種標(biāo)準(zhǔn) -- 不同語言的應(yīng)用程序與不同數(shù)據(jù)庫服務(wù)器之間通訊的標(biāo)準(zhǔn)
- 一組API(應(yīng)用程序接口)呼畸,支持應(yīng)用程序與數(shù)據(jù)庫服務(wù)器的交互
- 應(yīng)用程序通過調(diào)用ODBC API, 實現(xiàn)
- 與數(shù)據(jù)服務(wù)器的連接
- 向數(shù)據(jù)庫發(fā)送SQL命令
- 一條一條的提取數(shù)據(jù)庫檢索結(jié)果的元組傳遞給應(yīng)用程序的變量
- ODBC可以配合很多高級語言來使用痕支,如C,C++, C#, Visual Basic, PowerBuilder等...
JDBC
JDBC是一組Java版的應(yīng)用程序接口API,提供了Java應(yīng)用程序與數(shù)據(jù)庫服務(wù)器的連接和通訊能力.
概念性的基本過程
打開一個連接蛮原;創(chuàng)建"Statement"對象卧须,并設(shè)置查詢語句;使用Statement對象執(zhí)行查詢儒陨,發(fā)送查詢給數(shù)據(jù)庫服務(wù)器和返回結(jié)果給應(yīng)用程序花嘶;處理錯誤的例外機制.
具體的實施過程
- 傳遞給Driver給DriverManager, 加載數(shù)據(jù)庫驅(qū)動
Class.forName() - 通過URL得到一個Connection對象, 建立數(shù)據(jù)庫連接
- DriverManager.getConnection(sDBUrl)
- DriverManager.getConnection(sDBUrl, sDBUserID, sDBPassword)
- 接著創(chuàng)建一個Statement對象(PreparedStatement或CallableStatement), 用來查詢或者修改數(shù)據(jù)庫
- Statement stmt=con.createStatement()
- 查詢返回一個ResultSet
- ResultSet rs=stmt.executeQuery(sSQL)
public static void JDBCexample(String dbid, String userid, String passwd){
try { //錯誤捕獲
Class.forName ("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection(
"jdbc:oracle:thin:@db.yale.edu:1521:univdb", userid, passwd);
//加載數(shù)據(jù)庫驅(qū)動,建立數(shù)據(jù)庫連接
Statement stmt = conn.createStatement();
//創(chuàng)建一個語句對象
… Do Actual Work ….
//進行SQL語句的執(zhí)行與處理工作
stmt.close();
conn.close();
//關(guān)閉語句對象蹦漠,關(guān)閉連接
} catch (SQLException sqle) {
System.out.println("SQLException : " + sqle);
}
}
插入語句:
try {
stmt.executeUpdate( "insert into instructor values(‘77987', ‘Kim', ‘Physics’,98000)");
//插入一條記錄
} catch (SQLException sqle) {
System.out.println("Could not insert tuple. " + sqle);
}
獲取值:
// 執(zhí)行一條SQL語句椭员。獲取下一條記錄。提取“dept_name”屬性值笛园,提取第2列即“平均工資”列的值
ResultSet rset = stmt.executeQuery( "select dept_name, avg(salary)"+ "from instructor group by dept_name");
while ( rset.next() ) {
System.out.println(rset.getString("dept_name") + " " + rset.getFloat(2));
}
嵌入式語言-ODBC-JDBC比較
嵌入式SQL的思維模式
ODBC的思維模式
JDBC的思維模式
- 相同點: 都是建立數(shù)據(jù)庫連接, 執(zhí)行sql, 處理結(jié)果, 釋放連接, 流程基本一致
- 不同點, 操作方式的不同:
- 嵌入式SQL按照語句進行操作
- ODBC按照函數(shù)來進行操作
- JDBC按照對象來進行操作
體會: 不斷的抽象, 不斷的分層達到, 通用, 易用的目的.