系統(tǒng)命名與SQL命名之爭(zhēng):訪問數(shù)據(jù)庫對(duì)象

執(zhí)行 SQL 語句時(shí),您可以使用系統(tǒng)命名規(guī)范或者 SQL 命名規(guī)范來運(yùn)行它們。上一篇文章重點(diǎn)探討了使用 SQL 和系統(tǒng)命名規(guī)范創(chuàng)建數(shù)據(jù)庫對(duì)象時(shí),所有權(quán)和訪問權(quán)限之間的差異。

本文將介紹系統(tǒng)命名與 sql 命名在訪問表和視圖以及存儲(chǔ)過程和用戶定義的函數(shù) (udf) 時(shí)的行為差異,重點(diǎn)關(guān)注使用這些對(duì)象的非限定引用時(shí)的不同行為。

本文介紹了使用系統(tǒng)和 SQL 命名規(guī)范運(yùn)行 SQL 語句時(shí)的不同行為。本系列的 第 1 部分 主要關(guān)注在使用 SQL 創(chuàng)建 IBM? DB2? 對(duì)象時(shí),系統(tǒng)命名規(guī)范和 SQL 命名規(guī)范如何導(dǎo)致對(duì)象所有權(quán)和訪問權(quán)限差異。

命名規(guī)范還會(huì)決定在使用模式顯式限定 DB2 對(duì)象引用時(shí),使用哪個(gè)字符來分隔模式與對(duì)象名稱,系統(tǒng)命名 (*SYS) 使用的是斜杠 (/),而 SQL 命名 (*SQL) 使用的是圓點(diǎn) (.)。

不過,IBM i 應(yīng)用程序很少會(huì)通過顯式指定模式名稱的方式來訪問 DB2 對(duì)象。這些應(yīng)用程序依靠搜索庫列表來查找恰當(dāng)?shù)膶?duì)象。它們將使用在庫列表中找到的第一個(gè)具有指定名稱和適當(dāng)對(duì)象類型的對(duì)象。在測(cè)試應(yīng)用程序時(shí),包含新程序和數(shù)據(jù)集的庫會(huì)直接插入庫列表的頂部。通過這種方式,即可輕松處理新舊程序的混合,輕松處理生產(chǎn)數(shù)據(jù)和測(cè)試數(shù)據(jù)。具有顯式限定的模式引用的應(yīng)用程序必須手動(dòng)更改,然后才能在不同的環(huán)境中運(yùn)行。

對(duì)于典型的 IBM i 應(yīng)用程序,下面我們將根據(jù)訪問 SQL 語句中指定的非限定對(duì)象的命名規(guī)范來分析不同的行為。

訪問數(shù)據(jù)

持久用戶數(shù)據(jù)僅存儲(chǔ)在表中。表中的數(shù)據(jù)可直接訪問,也可通過別名或視圖間接訪問。要在 SQL 語句中訪問表、視圖或別名,可以通過模式名稱顯式限定對(duì)象,也可以根據(jù)命名規(guī)范隱式解析模式名稱。

數(shù)據(jù)訪問方法

IBM DB2 for i 對(duì)象中的數(shù)據(jù)可通過某些高級(jí)語言(例如 RPG 或 COBOL)中使用的記錄級(jí)訪問接口進(jìn)行訪問和維護(hù)。

不過,SQL 是新近開發(fā)的 IBM i 應(yīng)用軟件和程序中訪問數(shù)據(jù)的最常用接口。SQL 語句可作為 靜態(tài) 或 動(dòng)態(tài) SQL 運(yùn)行。靜態(tài) SQL 與動(dòng)態(tài) SQL 之間的主要區(qū)別取決于 SQL 語句本身的生成方式。

  • 靜態(tài) SQL 語句

包含嵌入式 SQL 的 SQL 例程或應(yīng)用程序多使用靜態(tài) SQL 語句。靜態(tài) SQL 語句在程序或例程源代碼中采用硬編碼的形式。對(duì)于靜態(tài) SQL 語句來說,SQL 預(yù)編譯器將檢查 SQL 語法,評(píng)估對(duì)表和列的引用,并聲明所有宿主變量的數(shù)據(jù)類型。SQL 預(yù)編譯器也會(huì)根據(jù) 編譯時(shí)使用的命名規(guī)范,確定運(yùn)行時(shí)用于解析非限定數(shù)據(jù)庫對(duì)象的模式。從性能的角度來看,使用靜態(tài) SQL 是最佳選擇,因?yàn)橛行┎襟E(例如,語法檢查)是在編譯時(shí)完成的。

清單 1. 靜態(tài) SQL 語句 展示了一個(gè) RPG 程序內(nèi)嵌入的靜態(tài) SQL 語句,該語句用于確定特定年份的訂單數(shù)量。年份值將作為參數(shù)值 (ParYear) 傳遞給該過程。

清單 1.靜態(tài) SQL 語句

 				    	 	 D GetNbrOfOrders...  	 D                 PI            10I 0  	 D ParYear                        4P 0  Const  	  ...  	 D NbrOfOrders     S             10I 0  	 /Free  	  ...  	    Exec SQL  Select  Count(*)        Into :NbrOfOrders  	                from  Order_Header  	                Where Year(OrderDate) = :ParYear;  
  • 動(dòng)態(tài) SQL 語句

動(dòng)態(tài) SQL 語句是在程序的運(yùn)行時(shí)生成的。在構(gòu)建完成后,動(dòng)態(tài) SQL 語句的語法會(huì)被檢查,隨后將其轉(zhuǎn)為可執(zhí)行的 SQL 語句,以便運(yùn)行。

清單 2. 一個(gè) SQL 例程中的動(dòng)態(tài) SQL 語句 展示了創(chuàng)建 UDF COUNT_NUMBER_OF_ROWS 的 SQL 腳本。使用這個(gè)函數(shù),即可確定任意表、視圖或別名中的行數(shù)。表(或者視圖和別名)名稱以及模式名稱將作為參數(shù)值傳遞。調(diào)用該 UDF 時(shí),會(huì)以字符串的形式生成所執(zhí)行的 SQL 語句,其中包含傳遞的參數(shù)值。運(yùn)行 PREPARE 語句將其轉(zhuǎn)為可執(zhí)行 SQL 語句,隨后會(huì)檢查該字符串的語法,最后使用 EXECUTE 語句執(zhí)行該語句。由于編譯時(shí)并不了解運(yùn)行時(shí)會(huì)訪問哪些表或模式,因此需要使用動(dòng)態(tài) SQL。

清單 2. 一個(gè) SQL 例程中的動(dòng)態(tài) SQL 語句

 				    	 Create Function Count_Number_Of_Rows  	      (ParTable  VarChar(128),  	       ParSchema VarChar(128))  	       Returns Integer  	       Language SQL  	       Not Fenced  	   Begin  	      Declare RtnNbrRows Integer;  	      Declare String     VarChar(256);  	       	      Set String = 'Values(Select Count(*) From ';  	       	      If ParSchema > ' ' Then  	         Set String = String CONCAT ParSchema CONCAT '/';  	      End If;  	       	      Set String = String CONCAT ParTable CONCAT ') into ?';  	 	      PREPARE DynSQL From String;  	      EXECUTE DynSQL Using RtnNbrRows;  	      Return RtnNbrRows;  	   End;  

動(dòng)態(tài) SQL 語句可用于 SQL 例程之中,也可嵌入程序,但最常用于通過 ODBC 或 DB2 Web Query 等接口運(yùn)行 SQL 語句;以及通過 SQL 命令行處理程序來運(yùn)行 SQL 語句,例如 IBM System i? Navigator Run Script Interface 或 RUNSQLSTM 和 RUNSQL 命令行命令。清單 3. 采用交互的方式發(fā)出的動(dòng)態(tài) SQL 語句 展示了一條通過 System i Navigator Run Script Interface 運(yùn)行的動(dòng)態(tài) SQL 語句。

清單 3. 采用交互的方式發(fā)出的動(dòng)態(tài) SQL 語句

 				    	 Select * from Order_Header;

確定默認(rèn)模式

如果一條 SQL 語句包含非限定表、視圖或別名引用,那么 DB2 必須確定 默認(rèn)模式,并搜索該模式。模式 是 SQL 中類似于 IBM i 庫的術(shù)語。默認(rèn)模式的初始值取決于 SQL 環(huán)境中使用的命名規(guī)范,以及運(yùn)行的是 靜態(tài) SQL 語句,還是 動(dòng)態(tài) SQL 語句。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊13 分享