這篇文章將為大家詳細(xì)講解有關(guān)Oracle中命名塊之存儲過程的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
成都創(chuàng)新互聯(lián)從2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目網(wǎng)站制作、成都網(wǎng)站建設(shè)網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元銅山做網(wǎng)站,已為上家服務(wù),為銅山各地企業(yè)和個人服務(wù),聯(lián)系電話:028-86922220
一、匿名塊和命名塊
◆PL/SQL塊分為良好總:命名塊和匿名塊。
◆匿名塊:以declare或begin開始,每次執(zhí)行匿名塊都要通過客戶端工具將其發(fā)送給Oracle,經(jīng)過語法分析、編譯然后執(zhí)行。
◆命名塊:具有名稱的PL/SQL塊,這些命名塊被存儲在Oracle中,編譯一次,以后只可調(diào)用就可多次執(zhí)行。如:存儲過程、存儲函數(shù)、包、觸發(fā)器等、
存儲過程:無返回值;
存儲函數(shù):有返回值;
包:可容納多個過程或函數(shù)的一個容器(較好管理這些過程和函數(shù),類似于java中的包);
觸發(fā)器:在合適的實際被自動執(zhí)行。(無需調(diào)用,在滿足要求的情況下,自動執(zhí)行;觸發(fā)器也被稱為隱式執(zhí)行的命名塊!)
◆匿名塊和命名塊的區(qū)別:
匿名塊:能夠動態(tài)地創(chuàng)建和執(zhí)行過程代碼的PL/SQL結(jié)構(gòu),每次執(zhí)行匿名塊時就會自動的將該塊數(shù)據(jù)通過文本的形式發(fā)送給Oracle,然后執(zhí)行,反饋給用戶,每次執(zhí)行都需發(fā)送和編譯!
命名塊:持久化的方式將代碼作為數(shù)據(jù)庫屬性儲存在系統(tǒng)目錄中,在Oracle中編譯一次,下次若使用可直接調(diào)用執(zhí)行,無需再次編譯,非常高效。
二、存儲過程:
存儲過程是具有名稱、完整特定功能和無返回值的PL/SQL塊,只需發(fā)送調(diào)用命令即可執(zhí)行該過程,能夠?qū)崿F(xiàn)代碼的重用,不能在SQL語句當(dāng)中調(diào)用!
◆創(chuàng)建存儲過程:
格式:create[or replace] procedure proc_name [(para1[int|out|in out]type,...)] {is|AS} prdc_body
proc_name表示存儲過程名;
para1表示參數(shù)名;type是參數(shù)para1的數(shù)據(jù)類型;
proc_body表示過程體.過程體是遵循PL/SQL塊的結(jié)構(gòu),但不能使用declare關(guān)鍵字,end后面可帶有過程名。
注意:參數(shù)列表是可選的
◆調(diào)用存儲過程:(存儲過程創(chuàng)建的時候會自動的保存在Oracle中,在執(zhí)行儲存過程的時候,PL/SQL塊只需調(diào)用即可!)
(1)如果在PL/SQL塊中調(diào)用,直接使用proc_name(...);
(2)如果使用sql plus環(huán)境中,需要使用 EXEC proc_name(...)的形式;
(3)如果存儲過程無參數(shù),這調(diào)用時可帶有圓括號也可不帶!
【示例】創(chuàng)建一個無參數(shù)的存儲過程(顯示所有員工的信息)
create or replace procedure pr_show_employee is --進(jìn)入塊的聲明部分(無需編寫declare關(guān)鍵字) --定義游標(biāo) cursor v_emp_cursor is select * from employees; --定義游標(biāo)類型的記錄型行變量 v_emp_record v_emp_cursor%rowtype; begin for v_emp_record in v_emp_cursor loop dbms_output.put_line(v_emp_record.employee_id||','||v_emp_record.first_name||','|| v_emp_record.last_name||','||v_emp_record.salary); end loop; end pr_show_employee ;
--調(diào)用存儲過程(在一個匿名塊中執(zhí)行)
begin pr_show_employee(); end;
【示例】存儲過程的參數(shù)接受產(chǎn)品類別編號,輸出該類所有產(chǎn)品的信息
create or replace procedure pr_show_product( product_type products.product_type_id%type) as --定義游標(biāo) cursor v_prd_cursor is select * from products p where product_type = p.product_type_id; --定義游標(biāo)的行類型變量 v_prd_record v_prd_cursor%rowtype; begin for v_prd_record in v_prd_cursor loop dbms_output.put_line(v_prd_record.product_id||','||v_prd_record||','||product_type_id||','||v_prd_record.description||',' ||v_prd_record. name||','||v_prd_record.price); end loop; end pr_show_product; --調(diào)用存儲過程(執(zhí)行) declare --定義編號變量的類型 v_prd_type_id products.product_type_id%type := 1; begin pr_show_product(v_prd_type_id); end;
◆參數(shù)的傳遞模式:
參數(shù)傳遞有三種模式:in、out、in out
in:過程調(diào)用時,實參的值會傳遞給形參。形參被看作是常量,在過程內(nèi)部不能被修改。
out:過程調(diào)用時,實參的值被忽略,形參為null值,在過程內(nèi)部形參變量可以讀寫。過程結(jié)束時,形參的值賦值給實參!
in out:過程調(diào)用時,實參的值傳遞給形參,在過程內(nèi)部形參變量可讀可寫,過程結(jié)束時,形參的值賦值給實參。
注意:如果在定義存儲過程時,沒有指明參數(shù)傳遞模式,則默認(rèn)為 in 模式
【示例】創(chuàng)建一個有參數(shù)傳遞默認(rèn)的存儲過程
create or replace procedure pr_test(p_1 in out varchar2) is begin dbms_output.put_line('p_1='||p_1); p_1 := 'abc'; dbms_output.put_line('p_1='||p_1); end pr_test;
--調(diào)用存儲過程
declare v_1 varchar2(5) := 'wwww'; begin pr_test(v_1); dbms_output.put_line('v_1='||v_1); end;
注意:(1)在創(chuàng)建存儲過程時,形參類型不能指定具體的長度,字符類型就為 varchar2,數(shù)字類型就是number;默認(rèn)和實參類型的長度等同
(2)使用 in 模式,形參接受實參的值,默認(rèn)形參為常量,在存儲過程當(dāng)中不能被修改,否則出錯!
(3)使用 out 模式,實參的值被忽略,但必須是變量,用來接收存儲過程執(zhí)行完形參的值;而形參是可讀可寫的。
(4)使用 in out 模式,實參的值傳遞給形參,也必須是變量,形參可讀可寫,最后執(zhí)行完存儲過程形參的值傳遞給實參!
(5)參數(shù)傳遞,實參的值和長度或精度約束會傳遞給形參,因此,形參不能有長度或精度的約束。在過程中給形參賦值時,要注意它的長度或精度的限制!
關(guān)于“Oracle中命名塊之存儲過程的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。