第15講:嵌入式SQL語句(動態SQL)


一、動態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


免責聲明!

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



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