国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 開(kāi)發(fā) > 綜合 > 正文

PL/SQL構(gòu)建代碼分析工具之構(gòu)建代碼分析實(shí)用程序

2024-07-21 02:33:31
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
    構(gòu)建實(shí)用程序驗(yàn)證代碼質(zhì)量的內(nèi)部詳情     許多開(kāi)發(fā)人員和開(kāi)發(fā)經(jīng)理所面對(duì)的一個(gè)突出問(wèn)題就是找到改進(jìn)代碼質(zhì)量的方法。于是我決定以一種獨(dú)特的方式來(lái)解決這一難題。在隨后的幾個(gè)月中,我將在 OTN 上發(fā)布一系列文章說(shuō)明我是如何構(gòu)建 Codecheck 的。Codecheck 是依靠數(shù)據(jù)字典中的信息,執(zhí)行重要任務(wù)(即分析程序包以檢測(cè)這些程序包是否包含重載多義性)的一個(gè) PL/SQL 程序包。由于我采用的是自頂而下的設(shè)計(jì)方法并運(yùn)用了許多我在 《Oracle PL/SQL 最佳實(shí)戰(zhàn)技巧》 中推薦的最佳實(shí)戰(zhàn)技巧,因此不想只是簡(jiǎn)單地呈現(xiàn)結(jié)果,而更愿意邀請(qǐng)您和我一同演練這一過(guò)程。 邊條"構(gòu)建實(shí)用程序的步驟"位于本文的結(jié)束處。    深入了解這一實(shí)用程序要花費(fèi)一些時(shí)間,因?yàn)槲蚁虢柽@個(gè)機(jī)會(huì)實(shí)際經(jīng)歷一下開(kāi)發(fā)生命周期中的幾個(gè)階段。在以后的幾個(gè)月中,我將進(jìn)行以下工作:    確定我希望 Codecheck 解決的問(wèn)題并明確需求。    給出驗(yàn)證實(shí)用程序正確運(yùn)行的測(cè)試案例。    研究有助于解決問(wèn)題的相關(guān)技術(shù)。    給出實(shí)用程序的整體設(shè)計(jì)(結(jié)果發(fā)現(xiàn)測(cè)試要求會(huì)對(duì)我的設(shè)計(jì)產(chǎn)生影響)。    逐步細(xì)化以采用易于編寫(xiě)、理解和部署的代碼塊來(lái)構(gòu)建解決方案。    利用 utPLSQL 單元測(cè)試框架自動(dòng)對(duì)實(shí)用程序進(jìn)行復(fù)雜的回歸測(cè)試。    (關(guān)于構(gòu)建 Codecheck 的每篇文章分別描述哪一部分內(nèi)容的具體信息,請(qǐng)參見(jiàn)邊條"構(gòu)建實(shí)用程序的步驟")。    通過(guò)對(duì) Codecheck 及其相關(guān)概念的學(xué)習(xí),您將了解到 Oracle PL/SQL 最新、最好的一些特性,如多層集合。此外,我還將提供一套平臺(tái),您可以在該平臺(tái)上構(gòu)建和添加自己的 QA 檢查,例如檢查參數(shù)是否太多或太少、查找所有程序包都要用到的程序,并確保代碼符合命名規(guī)則。也許親身演練的最大好處在于有機(jī)會(huì)看到實(shí)際運(yùn)用的一些最佳實(shí)戰(zhàn)技巧,這可能是學(xué)習(xí)如何使用這些技巧最簡(jiǎn)單的方法。    我需要聲明一點(diǎn):我已經(jīng)完成了 Codecheck 的一個(gè)運(yùn)行版本。我計(jì)劃一邊寫(xiě)下該實(shí)用程序的構(gòu)造經(jīng)過(guò),一邊對(duì)其進(jìn)行改進(jìn)。因此,該系列每一篇文章的下載都將包含一個(gè) Codecheck (codecheck.zip)。請(qǐng)隨意下載并立即使用。假如您在調(diào)試的過(guò)程中碰到什么問(wèn)題,或是有一些改進(jìn)意見(jiàn),請(qǐng)發(fā)送至 steven@stevenfeuerstein.com.    確定問(wèn)題:程序包中的重載多義性    為了寫(xiě)出高質(zhì)量的程序而顧及到方方面面會(huì)令人發(fā)瘋。因此,我打算集中到幾個(gè)典型的問(wèn)題,以免屢屢受挫而不得不放棄創(chuàng)建 Codecheck 的初衷。編寫(xiě)和成功編譯包含不可調(diào)用程序的 PL/SQL 程序包是極有可能的,而這并沒(méi)有多大的意義,不是嗎?讓我們來(lái)看看這一希奇的情形是怎樣出現(xiàn)的。    Oracle PL/SQL 支持負(fù)載,也就是所謂的靜態(tài)多態(tài)性。這就意味著,您能在任何聲明段或程序包中用相同的名稱(chēng)定義兩個(gè)或多個(gè)程序,只要這些程序區(qū)別顯著(通常是參數(shù)列表不同),編譯器能夠辨別您想要使用哪個(gè)程序。重載對(duì)于提高代碼的可用性來(lái)說(shuō)是一項(xiàng)有用的技術(shù)。然而,它也會(huì)帶來(lái)一些問(wèn)題,非凡是假如參數(shù)列表很長(zhǎng),其中的參數(shù)有些有缺省值,有些沒(méi)有,則尤其如此。    為了向您證實(shí)開(kāi)發(fā)人員的確會(huì)面臨這一問(wèn)題,我挑選了幾個(gè)可能會(huì)出錯(cuò)的例子,這些例子是以下面所示的程序包說(shuō)明開(kāi)頭的:    CREATE OR REPLACE PACKAGE salespkg IS PROCEDURE calc_total (zone_in IN VARCHAR2);    PROCEDURE calc_total (reg_in IN VARCHAR2);END salespkg;/    這一部分在編譯時(shí)不會(huì)有任何問(wèn)題,正如其程序體一樣。其中有兩段重載程序,都命名為 calc_total.其中之一接收一個(gè)地段,例如 'ZONE 15',然后計(jì)算該地段的總銷(xiāo)售額。而第二個(gè)程序則接收一個(gè)區(qū)域,例如 'SOUTHWEST',然后計(jì)算該區(qū)域的總銷(xiāo)售額。但當(dāng)我試圖調(diào)用其中某個(gè)程序,卻出現(xiàn)一個(gè)錯(cuò)誤。    SQL> exec salespkg.calc_total ('ZONE 15')    BEGIN salespkg.calc_total ('ZONE 15'); END;* ERROR at line 1:ORA-06550:line 1, column 7:PLS-00307:too many declarations of 'CALC_TOTAL' match this call    該錯(cuò)誤消息明確地指出了這一問(wèn)題:"Too many declarations of CALC_TOTAL match this call."(有多個(gè) CALC_TOTAL 的聲明與該調(diào)用相匹配)。您可以看到,計(jì)算機(jī)并不是十分的聰明。您我都可以看出 'ZONE 15' 是一個(gè)地段;難道 PL/SQL 編譯器就不能識(shí)別出這是"地段"的 calc_total 嗎(即帶有 zone_in 參數(shù)的重載)?不幸的是,編譯器并不是這樣工作的。'ZONE 15' 是字符串的字面意義,編譯器無(wú)法分析。編譯器無(wú)法知道應(yīng)該使用哪段程序,然后就甩手不管了。
    我們?cè)撊绾谓鉀Q這一問(wèn)題呢?在這種特定情況下,我可以通過(guò)使用指定的參數(shù)值來(lái)消除多義性:    BEGIN salespkg.calc_total (zone_in => 'ZONE 15');END;    在這個(gè)實(shí)例,我想要告訴編譯器使用特定的參數(shù) (zone_in)。因?yàn)檫@兩個(gè)重載程序中,只有一個(gè)程序的參數(shù)名與之相符,這樣編譯器就知道該調(diào)用這兩個(gè)中的哪一個(gè)了。盡管如此,不得不 使用參數(shù)名引用來(lái)調(diào)用一個(gè)過(guò)程或一個(gè)函數(shù)還是令人難以接受。這明顯是一個(gè)糟糕的設(shè)計(jì)—而且會(huì)越來(lái)越糟。考慮下面的程序包說(shuō)明:    CREATE OR REPLACE PACKAGE salespkg IS PROCEDURE calc_total (zone_in IN VARCHAR2);    PROCEDURE calc_total (zone_in IN CHAR);END salespkg;/    同樣,這個(gè)程序包在編譯時(shí)也不會(huì)有任何問(wèn)題。但現(xiàn)在又面臨另一種情況:無(wú)法調(diào)用這些過(guò)程中的任意一個(gè)。他們共享程序名和參數(shù)名。唯一的區(qū)別就是數(shù)據(jù)類(lèi)型。VARCHAR2 當(dāng)然不同于 CHAR,因此編譯器會(huì)讓您輕松過(guò)關(guān)。但不幸地是,這兩種數(shù)據(jù)類(lèi)型的差異性還不夠大,這將導(dǎo)致在真正試圖使用代碼的時(shí)侯出現(xiàn)難題。考慮下面的一段代碼:    BEGIN salespkg.calc_total ('ZONE15');END;    'ZONE 15' 是固定長(zhǎng)還是可變長(zhǎng)?PL/SQL 文檔中說(shuō)道 "All string literals except the null string ('') have datatype CHAR,"(所有非空串的字符串文字都是 CHAR 型)但是編譯器并沒(méi)有意識(shí)到這個(gè)問(wèn)題。非常希奇,即使向程序傳送了一個(gè)顯式聲明為固定長(zhǎng)度的字符串,仍然會(huì)出現(xiàn)問(wèn)題。    SQL> DECLARE 2     l_zone CHAR(6) := 'ZONE15';3  BEGIN 4     salespkg.calc_total (l_zone);5  END;6  / salespkg.calc_total (l_zone);* ERROR at line 4:PLS-00307:too many declarations of 'CALC_TOTAL' match this call    如您所見(jiàn),確實(shí)可以定義這樣一個(gè)程序包重載,即它可以順利通過(guò)編譯,但要么不可用,要么只能通過(guò)"非自然行為"使用,例如強(qiáng)制使用參數(shù)名引用。    我將采用什么樣的解決方案呢?    為了識(shí)別這些重載問(wèn)題,我產(chǎn)生如下的想法:也許我可以構(gòu)建一個(gè)實(shí)用程序"自動(dòng)"掃描程序包,檢查所有可能的有效程序調(diào)用置換,并提醒我注重那些多義重載。我能夠作到這一點(diǎn)嗎?看起來(lái)我應(yīng)該要能夠?qū)⒊绦虬x解析為各段程序,同時(shí)解析出每個(gè)程序的參數(shù)列表。我應(yīng)該能夠取出這些參數(shù)的數(shù)據(jù)類(lèi)型和缺省值。我如何才能獲得這些信息呢?遺憾的是,我對(duì) PL/SQL 解析器沒(méi)有 API 級(jí)的訪問(wèn)權(quán)限,非凡是不能從 PL/SQL 自身內(nèi)部來(lái)進(jìn)行訪問(wèn)。而且我壓根不想考慮自己編寫(xiě)一個(gè)解析器。那么一個(gè)積極的(深受困擾的)實(shí)用程序構(gòu)造者會(huì)如何去做呢?他會(huì)查找可以替代的方法。    還有沒(méi)有其他的方法可以從程序中提取這一信息呢?我想起每當(dāng)我編譯一個(gè) PL/SQL 程序,Oracle 數(shù)據(jù)庫(kù)就會(huì)對(duì)源代碼進(jìn)行解析并將其裝載到數(shù)據(jù)字典中。然后就可以提供各種數(shù)據(jù)字典視圖給出對(duì)所存儲(chǔ)代碼的不同描述。ALL_SOURCE 揭示了源代碼。ALL_DEPENDENCIES 顯示各個(gè)對(duì)象之間的依靠性。ALL_OBJECTS 告訴我哪個(gè)程序是 INVALID.也許有某個(gè)數(shù)據(jù)字典視圖有助于解決這一問(wèn)題。我該如何找到它呢?數(shù)據(jù)字典中有很多視圖,而且這些視圖都非常晦澀。    為了能對(duì)此有所幫助,我構(gòu)建了一個(gè)名為 dd_view_scan 的實(shí)用程序,該程序可以找到符合需要的那些視圖(參見(jiàn)表 1;完整的實(shí)現(xiàn)行位于 ddviewscan.sp 文件中)。使用 dd_view_scan,我可以輕松搜索視圖集以便找到那些可能會(huì)提供幫助的數(shù)據(jù)源。接下來(lái)我會(huì)對(duì)某個(gè)特定的視圖進(jìn)行深入分析,看看它是否真的包含我所需要的信息。例如,假如我希望分析程序的重載,那么我就不僅需要知道程序名,還需要檢查參數(shù)列表(也就是傳遞的參數(shù))。首先我會(huì)向 dd_view_scan 查詢(xún)含有單詞parameter 或 argument 的那些數(shù)據(jù)字典視圖。您可以在 列表 2 中查看到相應(yīng)的結(jié)果。(注重:我使用Oracle9i Release 2 得到這些結(jié)果。使用早期版本運(yùn)行相同的查詢(xún)可能會(huì)得到不同的結(jié)果。)    仔細(xì)檢查該列表,ALL_ARGUMENTS 引起了我的注重。其他的參數(shù)看起來(lái)要更具針對(duì)性,不是我想要的那種。當(dāng)我仔細(xì)分析該參數(shù),我找到了程序包名、參數(shù)名和數(shù)據(jù)類(lèi)型(參見(jiàn)列表 3)。這些看起來(lái)就比較接近我的目標(biāo),有必要深入查看一下。讓我們繼續(xù)進(jìn)行探討。    研究:有關(guān) ALL_ARGUMENTS 的全部?jī)?nèi)容    下一步,查看 Oracle 文檔集。我急切地去查看 Oracle9i 文檔,希望能從中找到答案。我從瀏覽器中打開(kāi)文檔,使用 Master Index,立即縮小了 ALL_ARGUMENTS 的范圍。表 1 顯示了對(duì)該視圖每一列的描述。使用下面的查詢(xún),您可以順便獲得雖不相同但還相近的信息(參見(jiàn) all_arguments_cols.sql):
    SELECT column_name, comments FROM all_col_comments WHERE table_name='ALL_ARGUMENTS'    遺憾的是,您在表 1 中所見(jiàn)的就是 Oracle 可提供的所有信息。無(wú)論如何,我們已經(jīng)邁出了第一步。許多列的引入都是不言而喻的。而對(duì)于其他的,例如 OVERLOAD、POSITION 和 DATA_LEVEL,就不太清楚了。    下面,我需要確信我已經(jīng)理解了 ALL_ARGUMENTS 的內(nèi)容。我還必須證實(shí) ALL_ARGUMENTS 包含了 Oracle 所說(shuō)的它包含的東西。假如您研究 Oracle 技術(shù)超過(guò)六個(gè)月,那么您就會(huì)明白任何事都不能想當(dāng)然。文檔中對(duì)某技術(shù)有某種說(shuō)法,并不意味著該技術(shù)本身就是那樣的。某個(gè)作者(例如 Steven Feuerstein)說(shuō)某技術(shù)能夠在其筆記本電腦中 windows 2000 下的 Oracle9i Release 2 上運(yùn)行,并不意味著該技術(shù)在您的系統(tǒng)中也會(huì)以同樣的方式運(yùn)行。自己進(jìn)行測(cè)試來(lái)驗(yàn)證取決于您的應(yīng)用程序的那些操作是非常重要的。    下面就是我所作的一些工作:我將名為 allargs_test 的程序包(位于 all_arguments.tst 文件中)放在一起。該程序包定義了一個(gè)帶有子程序的包,這些子程序含有各種不同的參數(shù)組合(或者沒(méi)有),這些參數(shù)會(huì)用到大量不同的數(shù)據(jù)類(lèi)型、參數(shù)模式等。    然后,我又構(gòu)造了一些查詢(xún)以檢查 ALL_ARGUMENTS 必須向該程序包提供哪些信息。可以在 allargs*.sql 腳本中找到這些查詢(xún)。為了讓您能夠看到 ALL_ARGUMENTS 內(nèi)容,我會(huì)回顧這些查詢(xún)的某些結(jié)果。隨后我將提供一個(gè)發(fā)現(xiàn)結(jié)果列表,該列表將引導(dǎo)我設(shè)計(jì)和實(shí)現(xiàn) Codecheck.    假如有一個(gè)帶有下列說(shuō)明的程序包:    CREATE PACKAGE allargs_test IS PROCEDURE difftype1;    FUNCTION difftype1 RETURN VARCHAR2;END;    那么這些程序的ALL_ARGUMENTS 內(nèi)容將是如下所示:    Core ALL_ARGUMENTS Info for "allargs_test.difftype1"    OVLD  ARGNAME           POS   SEQ   LVL TYPE            DEFVAL IN_OUT----- --------------- ----- ----- ----- --------------- ------ ---------    1                         1     0     0                          IN 2                         0     1     0 VARCHAR2                 OUT    通過(guò)該結(jié)果,我得出以下結(jié)論:    假如該程序是重載的,則 OVERLOAD 列(在上面的例子中簡(jiǎn)稱(chēng)為 OVLD)表明這是第 N 個(gè)重載;否則該列為 NULL.當(dāng)某個(gè)過(guò)程沒(méi)有參數(shù),ALL_ARGUMENTS 會(huì)包含一個(gè)位置為 1 而序號(hào)和層次均為 0 的一行。    當(dāng)某個(gè)函數(shù)沒(méi)有參數(shù),就不會(huì)有這樣一個(gè)非凡行。與此不同,它僅有一行描述 RETURN 子句,其中位置為 0. RETURN 子句的 argument_nameRETURN 為NULL.    現(xiàn)在來(lái)看一下 表 4,該表在 ALL_ARGUMENTS 中顯示了一些描述過(guò)程 composites 的行,這些行里裝載的全部是簡(jiǎn)單的、或復(fù)合的數(shù)據(jù)類(lèi)型,例如記錄或是集合(參閱 all_arguments.tst 獲得每一類(lèi)型的完整定義):    CREATE OR REPLACE PACKAGE allargs_test IS PROCEDURE composites (account_in NUMBER,person person%ROWTYPE,multirec myrec3,num_table number_table,recs_table myrec_table);END;    在分析這些信息后,我得出以下結(jié)論:
    層次顯示的是參數(shù)列表中的嵌套層數(shù)。所有真正出現(xiàn)在參數(shù)列表中的參數(shù)層次都為0.假如某個(gè)參數(shù)是一個(gè)復(fù)合參數(shù),則該復(fù)合參數(shù)中的每一個(gè)元素(例如每一個(gè)記錄的字段)在 ALL_ARGUMENTS 顯示的層次就為1,依此類(lèi)推。    位置和層次的組合對(duì)于給定程序的 ALL_ARGUMENTS 行不是唯一的,即使在單一重載內(nèi)也是如此。但是,位置和層次的組合對(duì)于某個(gè)給定的"0 層"參數(shù) (參數(shù)列表中實(shí)際顯示的參數(shù))卻是唯一的。    由于能夠在其他復(fù)合參數(shù)中聲明如集合和記錄這樣的復(fù)合參數(shù),而且對(duì)嵌套層數(shù)沒(méi)有限制,ALL_ARGUMENTS 的內(nèi)容可能會(huì)變得非常復(fù)雜。    數(shù)據(jù)類(lèi)型字段只顯示"通用"類(lèi)型,例如 PL/SQL RECORD,但并不顯示實(shí)際的類(lèi)型。為此,我需要進(jìn)一步深入研究一下 ALL_ARGUMENTS 的 TYPE_* 列。    表 5 顯示了下列程序的 ALL_ARGUMENTS 的內(nèi)容:    CREATE OR REPLACE PACKAGE allargs_test IS PROCEDURE oneargdef (onearg IN VARCHAR2 := NULL);PROCEDURE oneargdef (    onearg IN CHAR := 'abc');END;    在此例中,我費(fèi)了一些功夫發(fā)現(xiàn)了一個(gè)有趣的現(xiàn)象:即使 ALL_ARGUMENTS 聲稱(chēng)顯示了參數(shù)的缺省值,但實(shí)際上,這一列經(jīng)常是 NULL. 只有 當(dāng)您超出文檔的范圍探討,并對(duì) Oracle 技術(shù)的實(shí)質(zhì)進(jìn)行研究,才會(huì)發(fā)現(xiàn)這類(lèi)問(wèn)題。    最后,讓我們來(lái)看看所有的 TYPE_* 列中有些什么內(nèi)容。我使用 allargs3.sql 來(lái)顯示非 NULL TYPE_NAMEs 的參數(shù)。您可以在 在表 6 中看到復(fù)合參數(shù)的輸出。這是一個(gè)很有用的信息。假如我只依靠 DATA_TYPE 列的值,我能看到數(shù)據(jù)類(lèi)型是 PL/SQL 表,但是只要我查看一下 TYPE_SUBNAM 列,就可以知道該表是哪種類(lèi)型。    總結(jié)如下:一方面,ALL_ARGUMENTS 看起來(lái)很有用。它提供了有關(guān)參數(shù)的大量有用信息。另一方面,它又似乎缺少了某些可以呈現(xiàn)參數(shù)缺省值的要害信息。沒(méi)有這一信息,我只能對(duì)重載進(jìn)行基本的分析(該程序是否含有相同個(gè)數(shù)和相同類(lèi)型的參數(shù)?)。我不能報(bào)告出那些在調(diào)用中使用參數(shù)子集(且尾隨缺省參數(shù)被省略)時(shí)可能會(huì)有多義性的被重載程序,但我希望我的實(shí)用程序能夠處理這一復(fù)雜情況。下一步,我將試圖通過(guò)其它方式來(lái)獲得這一信息。    使用提供的程序包如何?    我已經(jīng)查看過(guò)數(shù)據(jù)字典的視圖集。Oracle 還提供哪些其他的預(yù)建工具?考慮到我曾參與共同編著一本書(shū)(名為 Oracle Built-in Packages),我很自然地就想到了尋找一個(gè)能提供幫助的、內(nèi)置的或提供的包(Oracle 術(shù)語(yǔ))。    查看 ALL_OBJECTS 尋找感愛(ài)好的程序包:    SQL> SELECT * 2    FROM all_objects 3   WHERE owner = 'SYS' 4     AND object_name LIKE '%ARGUMENT%' 5     AND object_type = 'PACKAGE';    no rows selected    什么也沒(méi)找到。下面,我要掃描 ALL_SOURCE,在提供的程序包的源代碼中搜索如 argument 和 parameter 這樣的單詞。實(shí)際上,我只能查看程序包說(shuō)明,因?yàn)槌绦虬某绦蝮w是封裝起來(lái)的(一種粗略的且只能取得部分成功的加密形式)。此外,每當(dāng)考慮運(yùn)行這些查詢(xún)時(shí),必須注重,有些查詢(xún)會(huì)持續(xù)很長(zhǎng) 時(shí)間,因?yàn)?ALL_SOURCE 通常包含了大量的行(我當(dāng)前所用的有 111,782 行)。    因此,我組合了另一個(gè)小的實(shí)用程序— dd_source_scan 過(guò)程(在下載的 ddsourcescan.sp 文件中查找該實(shí)用程序)—來(lái)確保我能夠盡可能有效地運(yùn)行查詢(xún)。我希望能找到所有包含數(shù)據(jù)字典視圖名 ALL_ARGUMENTS 的數(shù)據(jù)字典視圖。    BEGIN dd_source_scan ('%', 'all_arguments');END;    不幸的是,通過(guò)要害字檢索該掃描返回了 0 行。下一步的策略是要放寬查找條件,查找包含單詞 arguments 的程序包說(shuō)明:    BEGIN dd_source_scan ('%', 'arguments');END;    啊!這一次返回了很多線索,其中的一部分顯示在表 7 中。DBMS_DESCRIBE 很可能就是我要找的。    查看文檔,我找到:"The procedure DESCRIBE_PROCEDURE accepts the name of a stored procedure, a description of the procedure, and each of its parameters."(DESCRIBE_PROCEDURE 過(guò)程接收某個(gè)存儲(chǔ)過(guò)程的名稱(chēng)、有關(guān)該過(guò)程的描述和每個(gè)參數(shù))。我必須承認(rèn)這確實(shí)有點(diǎn)令人困惑。它是否要接收全部這些內(nèi)容?而且在接收完之后又能向我提供什么呢?遺憾的是,我所看的這部分文檔實(shí)在是描述得太簡(jiǎn)單了,這意味著我后來(lái)花費(fèi)了大量的時(shí)間來(lái)研究DBMS_DESCRIBE.DESCRIBE_PROCEDURE 的操作和特性。正如您隨后會(huì)在這一系列文章中發(fā)現(xiàn),我將我所學(xué)到的有關(guān)這一程序的所有知識(shí)都加以吸收,并將這些知識(shí)緩存到一個(gè)單獨(dú)的程序包中。    這個(gè)時(shí)候,我想要查看 DBMS_DESCRIBE 和 ALL_ARGUMENTS 的一些差異,并想要通過(guò)此舉從側(cè)面了解這些差異會(huì)對(duì)我的實(shí)現(xiàn)產(chǎn)生什么樣的影響。例如,這一過(guò)程通過(guò)使用一系列 PL/SQL 集合將有關(guān)其所有參數(shù)的信息傳遞回來(lái),從而返回"對(duì)過(guò)程的描述".這些集合的內(nèi)容大致地反映了某個(gè) ALL_ARGUMENTS 查詢(xún)檢索到的數(shù)據(jù),但是非常希奇(也許您不覺(jué)得),每一個(gè)集合都經(jīng)過(guò)不同的路由,最后到達(dá)的地方也略有差別。
    假如您發(fā)現(xiàn)盡管 ALL_ARGUMENTS 向您提供了數(shù)據(jù)類(lèi)型名(例如 VARCHAR2 或是 OBJECT),但 DBMS_DESCRIBE 返回的實(shí)際上是一個(gè)整型代碼,那么您就會(huì)就非常清楚它們之間的差異。總之,DBMS_DESCRIBE 在很大程度上都依靠于整型碼,而 ALL_ARGUMENTS 將這些碼轉(zhuǎn)換為描述性的字符串(這一點(diǎn)意義重大,因?yàn)樗且粋€(gè)可以讓您看到程序參數(shù)信息的數(shù)據(jù)字典視圖)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 偏关县| 赫章县| 都江堰市| 福泉市| 东乌珠穆沁旗| 深泽县| 伊金霍洛旗| 芒康县| 平远县| 田东县| 米林县| 贺兰县| 邵武市| 佛坪县| 抚顺县| 新化县| 祁连县| 武乡县| 西丰县| 北票市| 博野县| 贺兰县| 鄂尔多斯市| 徐水县| 天祝| 秦安县| 九寨沟县| 辽宁省| 宜阳县| 保康县| 湖州市| 盐山县| 华安县| 绵竹市| 宁都县| 清新县| 宝清县| 德州市| 廊坊市| 大关县| 泽州县|