上篇《懵懂oracle之存儲(chǔ)過程》已經(jīng)給大家介紹了很多關(guān)于開發(fā)存儲(chǔ)過程相關(guān)的基礎(chǔ)知識(shí),筆者盡最大的努力總結(jié)了所有接觸到的關(guān)于存儲(chǔ)過程的知識(shí),分享給大家和大家一起學(xué)習(xí)進(jìn)步。本篇文章既是完成上篇文章中未來得及總結(jié)的關(guān)于存儲(chǔ)過程的調(diào)用、測試等知識(shí)的匯總分享,也是對(duì)上篇文章的存儲(chǔ)過程的一個(gè)調(diào)試改錯(cuò)過程(由于知識(shí)的局限性和書寫時(shí)的疏忽等,之前的存儲(chǔ)過程有誤之處難免,正在不斷更改中,如果能得到大家的指正將使這個(gè)工作進(jìn)行地更快更好,助人為快樂之本!)。

      下面步入正題,介紹本篇知識(shí)匯總和分享:

      一、存儲(chǔ)過程的調(diào)用(代碼中sp_hll_test_20170415這個(gè)存儲(chǔ)過程可參見《懵懂oracle之存儲(chǔ)過程》,請(qǐng)注意查看使用最新的代碼)。

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開發(fā),動(dòng)畫培訓(xùn)

 1 declare -- 如果不需要定義參數(shù),那么就可去掉此declare部分,只使用begin……end塊 2   a      number; 3   b      date; 4   c      varchar2(20); 5   d      number; 6   status user_tables.status%type; 7   -- e    varchar2(20); 長度過小 8 /* 9     務(wù)必注意出參或出入?yún)樽兞繒r(shí),變量有長度限制時(shí)不得小于在存儲(chǔ)過程中會(huì)達(dá)到的最大值,10     否則會(huì)導(dǎo)致過長的字符串無法存入這個(gè)長度不夠的變量中,而報(bào)錯(cuò):11             ORA-06502: PL/SQL: 數(shù)字或值錯(cuò)誤 :  字符串緩沖區(qū)太小12   */13   e      varchar2(200);14 begin15  /*16    存儲(chǔ)過程調(diào)用時(shí),參數(shù)可以為常量、變量或綁定變量,參數(shù)調(diào)用方式可以為定位調(diào)用、命名調(diào)用或混合調(diào)用,17    同時(shí)參數(shù)和參數(shù)調(diào)用方式互不干涉,可隨意混合。18  */ 19  20   -- 調(diào)用方式1:定位符調(diào)用21   /* 22     實(shí)參和形參通過位置順序一一對(duì)應(yīng)。23     如下例調(diào)用,第一個(gè)參數(shù)a傳值給sp_hll_test_20170415的入?yún)_a等。24   */25   sp_hll_test_20170415(a, b, c,  d, status, e); 
26 27   -- 調(diào)用方式2:命名符調(diào)用28   /*29     在每一個(gè)參數(shù)設(shè)置的時(shí)候,都可以通過"形參=>實(shí)參"的格式,指定形參和實(shí)參,30     這樣一來,參數(shù)的位置順序就不必與存儲(chǔ)過程創(chuàng)建時(shí)規(guī)定的順序一致,可以自由調(diào)節(jié)。31     如下例,將參數(shù)順序完全顛倒。32   */33   sp_hll_test_20170415(io_e => e,  i_status => status, o_d => d, i_c => c, i_b => b,  i_a => a);34   35   -- sp_hll_test_20170415(io_e => e,  i_status => status, o_d => d, o_d => c, i_b => b,  i_a => a);36   -- 命名符調(diào)用時(shí),務(wù)必注意形參值別重復(fù),如上例的o_d形參,這樣會(huì)導(dǎo)致下面的異常:37   -- PLS-00703: 列表中具有指定參數(shù)的多個(gè)實(shí)例38 39   -- 調(diào)用方式3:定位符+命名符調(diào)用40   /*41     上面兩種調(diào)用方式可混合使用,但是注意,一旦某個(gè)參數(shù)有使用命名符,則后面所有的參數(shù)都得使用命名符,42     也就是說只能前x個(gè)參數(shù)為定位符方式,后y個(gè)參數(shù)為命名符方式(x+y=總參數(shù)數(shù)目)。43     否則會(huì)導(dǎo)致異常:“PLS-00312:一個(gè)定位相關(guān)參數(shù)沒有說明其相關(guān)性”44   */45   sp_hll_test_20170415(a, b, io_e =>e , i_c =>c,  i_status =>status,  o_d =>d);46 47   -- 參數(shù)方式:常量+變量48   a:=3;49   select sysdate into b from dual;50   sp_hll_test_20170415(a, b, '我是常量C',  d, '0', e); 
51   52   -- sp_hll_test_20170415(a, b, c,  2, status, e); 53   -- 出參、出入?yún)?,不能為常量,因?yàn)樗鼈儠?huì)被賦值54   -- PLS-00363: 表達(dá)式 '2' 不能用作賦值目標(biāo)55 56   -- 參數(shù)方式:綁定變量57   /*58     綁定變量,即冒號(hào)+變量名稱,這種方式我們?cè)谥暗拇鎯?chǔ)過程學(xué)習(xí)中也有接觸,在PLSQL59     的測試窗口中,對(duì)于綁定變量可在窗口下側(cè)的“變量-類型-值”區(qū)域右鍵進(jìn)行增加刪除等,可一一設(shè)定值,60     同時(shí)出參、出入?yún)⒃谧兓笠矔?huì)體現(xiàn)到“值”處(當(dāng)然在F9調(diào)試時(shí),不止綁定變量,其它變量也可添加進(jìn)去,61     查看每步運(yùn)行后的值)。62     ps:PLSQL中在存儲(chǔ)過程名稱上右鍵,通過右鍵菜單中“測試”功能,能迅速打開一個(gè)“測試窗口”,63         窗口內(nèi)部的調(diào)用存儲(chǔ)過程方式默認(rèn)為綁定變量+定位符調(diào)用方式,在后續(xù)調(diào)試教程中有圖有真相。64   */65   sp_hll_test_20170415(io_e => :e1,  i_status => :status1, o_d => :d1,  i_a => :a1);66 67   -- 參數(shù)方式:常量+變量+綁定變量68   sp_hll_test_20170415(1,to_date('2017-6-16', 'yyyy-mm-dd'), io_e =>e , i_c =>c,  i_status =>:status1,  o_d =>d);69 70   -- 默認(rèn)值使用71   -- sp_hll_test_20170415(a, b,  status, e); 72   /* 73     當(dāng)存儲(chǔ)過程參數(shù)含有默認(rèn)值的參數(shù)時(shí),那么在需要使用默認(rèn)值時(shí)一般可省略此參數(shù),74     但是這樣就和定位符調(diào)用有沖突,像上例調(diào)用,省略的是第三、四位的參數(shù),可對(duì)定位符來說,75     它第三、四位的參數(shù)沒有少,少的是第五、六位的參數(shù),同時(shí)第四位參數(shù)為number,而傳的e變量是varchar2(200)76     所以就會(huì)導(dǎo)致異常:       PLS-00306: 調(diào)用 'SP_HLL_TEST_20170415' 時(shí)參數(shù)個(gè)數(shù)或類型錯(cuò)誤77 78     因此如果既想使用定位符調(diào)用方式,又想能使用默認(rèn)值方式,那么必須在存儲(chǔ)過程定義的時(shí)候,79     把具有默認(rèn)值的參數(shù)反正參數(shù)列表的最后。80   */81   -- 或者可用命名符調(diào)用的方式來使用默認(rèn)值,如下例:82   sp_hll_test_20170415(io_e => :e1,  i_status => status, o_d => d,  i_a => a);83 84 end;

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開發(fā),動(dòng)畫培訓(xùn)

 

      二、存儲(chǔ)過程的調(diào)試。

      0.調(diào)試前提條件,用戶必須擁有調(diào)試的權(quán)限,否則“ORA-01031: insufficient privileges”會(huì)找你麻煩。

         解決方法:用管理員賬號(hào)給此用戶賦予權(quán)限

1 grant debug any procedure, debug connect session to 用戶;

      1.可通過下圖方式快捷進(jìn)入單個(gè)存儲(chǔ)過程的“測試窗口”。

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開發(fā),動(dòng)畫培訓(xùn)

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開發(fā),動(dòng)畫培訓(xùn)

      注意:若存儲(chǔ)過程無法調(diào)試,只顯示正在執(zhí)行,單步進(jìn)入、退出等按鈕無法使用,無法打斷點(diǎn)等情況,請(qǐng)核查數(shù)據(jù)庫是否采用了負(fù)載均衡,這時(shí)得將本機(jī)tns配置成下例情況,采用單節(jié)點(diǎn)登錄:

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開發(fā),動(dòng)畫培訓(xùn)

 1 test_one_node = 2   (description = 3   (address_list = 4     # 其中一個(gè)機(jī)器的ip及port信息 5     (address = (protocol = tcp)(host = *.*.*.* )(port = *)) 6     ) 7     (connect_data = 8         (server = dedicated) 9       (service_name = *)10       # show parameter instance_name 或者select instance_name from v$instance 可查看此值11       (instance_name = *)12     )  
13   )

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開發(fā),動(dòng)畫培訓(xùn)

 

      2.亦可在新打開或已有的一個(gè)“測試窗口”中,仿照一例書寫各種代碼進(jìn)行測試(甚至可以在測試單個(gè)存儲(chǔ)過程時(shí),將“create or replace procedure sp_hll_test_20170415……”創(chuàng)建存過及定義參數(shù)部分替換成一例中的declare部分+補(bǔ)充好缺少的參數(shù)信息,來測試這個(gè)存儲(chǔ)過程。這種方式和把此存儲(chǔ)過程“添加調(diào)試信息”后調(diào)試入存儲(chǔ)過程內(nèi)部也差不了多少,可看喜好或場景等按需使用)。

 平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開發(fā),動(dòng)畫培訓(xùn)

 平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開發(fā),動(dòng)畫培訓(xùn)

       3.調(diào)試需知(只介紹一些常用項(xiàng),其它的可自己探索)。

      單步進(jìn)入+單步退出=單步跳過。

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開發(fā),動(dòng)畫培訓(xùn)

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開發(fā),動(dòng)畫培訓(xùn)

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開發(fā),動(dòng)畫培訓(xùn)

 

作者:滾雪球俱樂部-何理利

出處: http://www.cnblogs.com/snowballed/

本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出 原文鏈接。 
如有疑問, 可郵件(he.lili1@ztesoft.com)咨詢。

http://www.cnblogs.com/snowballed/p/7028912.html