第十講 嵌入式SQL語言之動態(tài)SQL

動態(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, 有不同的定義. 例如:

X/Open標(biāo)準(zhǔn)的系統(tǒng)目錄

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等...
ODBC

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)用程序花嘶;處理錯誤的例外機制.

具體的實施過程

  1. 傳遞給Driver給DriverManager, 加載數(shù)據(jù)庫驅(qū)動
    Class.forName()
  2. 通過URL得到一個Connection對象, 建立數(shù)據(jù)庫連接
    • DriverManager.getConnection(sDBUrl)
    • DriverManager.getConnection(sDBUrl, sDBUserID, sDBPassword)
  3. 接著創(chuàng)建一個Statement對象(PreparedStatement或CallableStatement), 用來查詢或者修改數(shù)據(jù)庫
    • Statement stmt=con.createStatement()
  4. 查詢返回一個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的思維模式

嵌入式SQL的思維模式

ODBC的思維模式

ODBC的思維模式

JDBC的思維模式

JDBC的思維模式
  • 相同點: 都是建立數(shù)據(jù)庫連接, 執(zhí)行sql, 處理結(jié)果, 釋放連接, 流程基本一致
  • 不同點, 操作方式的不同:
    • 嵌入式SQL按照語句進行操作
    • ODBC按照函數(shù)來進行操作
    • JDBC按照對象來進行操作
有無ODBC的差別

體會: 不斷的抽象, 不斷的分層達到, 通用, 易用的目的.

本講回顧



數(shù)據(jù)庫系統(tǒng)學(xué)習(xí)筆記

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拆撼,一起剝皮案震驚了整個濱河市容劳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌闸度,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,332評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蚜印,死亡現(xiàn)場離奇詭異莺禁,居然都是意外死亡,警方通過查閱死者的電腦和手機窄赋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,508評論 3 385
  • 文/潘曉璐 我一進店門哟冬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人忆绰,你說我怎么就攤上這事浩峡。” “怎么了错敢?”我有些...
    開封第一講書人閱讀 157,812評論 0 348
  • 文/不壞的土叔 我叫張陵翰灾,是天一觀的道長。 經(jīng)常有香客問我稚茅,道長纸淮,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,607評論 1 284
  • 正文 為了忘掉前任亚享,我火速辦了婚禮咽块,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘欺税。我一直安慰自己侈沪,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,728評論 6 386
  • 文/花漫 我一把揭開白布晚凿。 她就那樣靜靜地躺著亭罪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪晃虫。 梳的紋絲不亂的頭發(fā)上皆撩,一...
    開封第一講書人閱讀 49,919評論 1 290
  • 那天,我揣著相機與錄音哲银,去河邊找鬼扛吞。 笑死,一個胖子當(dāng)著我的面吹牛荆责,可吹牛的內(nèi)容都是我干的滥比。 我是一名探鬼主播,決...
    沈念sama閱讀 39,071評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼做院,長吁一口氣:“原來是場噩夢啊……” “哼盲泛!你這毒婦竟也來了濒持?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,802評論 0 268
  • 序言:老撾萬榮一對情侶失蹤寺滚,失蹤者是張志新(化名)和其女友劉穎柑营,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體村视,經(jīng)...
    沈念sama閱讀 44,256評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡官套,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,576評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蚁孔。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奶赔。...
    茶點故事閱讀 38,712評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖杠氢,靈堂內(nèi)的尸體忽然破棺而出站刑,到底是詐尸還是另有隱情,我是刑警寧澤鼻百,帶...
    沈念sama閱讀 34,389評論 4 332
  • 正文 年R本政府宣布绞旅,位于F島的核電站,受9級特大地震影響愕宋,放射性物質(zhì)發(fā)生泄漏玻靡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,032評論 3 316
  • 文/蒙蒙 一中贝、第九天 我趴在偏房一處隱蔽的房頂上張望囤捻。 院中可真熱鬧,春花似錦邻寿、人聲如沸蝎土。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽誊涯。三九已至,卻和暖如春蒜撮,著一層夾襖步出監(jiān)牢的瞬間暴构,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,026評論 1 266
  • 我被黑心中介騙來泰國打工段磨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留取逾,地道東北人。 一個月前我還...
    沈念sama閱讀 46,473評論 2 360
  • 正文 我出身青樓苹支,卻偏偏與公主長得像砾隅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子债蜜,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,606評論 2 350

推薦閱讀更多精彩內(nèi)容