Oracle中命名塊之存儲(chǔ)過(guò)程的詳解及使用方法
一、匿名塊和命名塊
◆PL/SQL塊分為良好總:命名塊和匿名塊。
◆匿名塊:以declare或begin開始,每次執(zhí)行匿名塊都要通過(guò)客戶端工具將其發(fā)送給Oracle,經(jīng)過(guò)語(yǔ)法分析、編譯然后執(zhí)行。
◆命名塊:具有名稱的PL/SQL塊,這些命名塊被存儲(chǔ)在Oracle中,編譯一次,以后只可調(diào)用就可多次執(zhí)行。如:存儲(chǔ)過(guò)程、存儲(chǔ)函數(shù)、包、觸發(fā)器等、
存儲(chǔ)過(guò)程:無(wú)返回值;
存儲(chǔ)函數(shù):有返回值;
包:可容納多個(gè)過(guò)程或函數(shù)的一個(gè)容器(較好管理這些過(guò)程和函數(shù),類似于java中的包);
觸發(fā)器:在合適的實(shí)際被自動(dòng)執(zhí)行。(無(wú)需調(diào)用,在滿足要求的情況下,自動(dòng)執(zhí)行;觸發(fā)器也被稱為隱式執(zhí)行的命名塊!)
◆匿名塊和命名塊的區(qū)別:
匿名塊:能夠動(dòng)態(tài)地創(chuàng)建和執(zhí)行過(guò)程代碼的PL/SQL結(jié)構(gòu),每次執(zhí)行匿名塊時(shí)就會(huì)自動(dòng)的將該塊數(shù)據(jù)通過(guò)文本的形式發(fā)送給Oracle,然后執(zhí)行,反饋給用戶,每次執(zhí)行都需發(fā)送和編譯!
命名塊:持久化的方式將代碼作為數(shù)據(jù)庫(kù)屬性儲(chǔ)存在系統(tǒng)目錄中,在Oracle中編譯一次,下次若使用可直接調(diào)用執(zhí)行,無(wú)需再次編譯,非常高效。
二、存儲(chǔ)過(guò)程:
存儲(chǔ)過(guò)程是具有名稱、完整特定功能和無(wú)返回值的PL/SQL塊,只需發(fā)送調(diào)用命令即可執(zhí)行該過(guò)程,能夠?qū)崿F(xiàn)代碼的重用,不能在SQL語(yǔ)句當(dāng)中調(diào)用!
◆創(chuàng)建存儲(chǔ)過(guò)程:
格式:create[or replace] procedure proc_name
[(para1[int|out|in out]type,...)]
{is|AS}
prdc_body
proc_name表示存儲(chǔ)過(guò)程名;
para1表示參數(shù)名;type是參數(shù)para1的數(shù)據(jù)類型;
proc_body表示過(guò)程體.過(guò)程體是遵循PL/SQL塊的結(jié)構(gòu),但不能使用declare關(guān)鍵字,end后面可帶有過(guò)程名。
注意:參數(shù)列表是可選的
◆調(diào)用存儲(chǔ)過(guò)程:(存儲(chǔ)過(guò)程創(chuàng)建的時(shí)候會(huì)自動(dòng)的保存在Oracle中,在執(zhí)行儲(chǔ)存過(guò)程的時(shí)候,PL/SQL塊只需調(diào)用即可!)
(1)如果在PL/SQL塊中調(diào)用,直接使用proc_name(...);
(2)如果使用sql plus環(huán)境中,需要使用 EXEC proc_name(...)的形式;
(3)如果存儲(chǔ)過(guò)程無(wú)參數(shù),這調(diào)用時(shí)可帶有圓括號(hào)也可不帶!
【示例】創(chuàng)建一個(gè)無(wú)參數(shù)的存儲(chǔ)過(guò)程(顯示所有員工的信息)
create or replace procedure pr_show_employee
is
--進(jìn)入塊的聲明部分(無(wú)需編寫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)用存儲(chǔ)過(guò)程(在一個(gè)匿名塊中執(zhí)行)
begin pr_show_employee(); end;
【示例】存儲(chǔ)過(guò)程的參數(shù)接受產(chǎn)品類別編號(hào),輸出該類所有產(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)用存儲(chǔ)過(guò)程(執(zhí)行)
declare
--定義編號(hào)變量的類型
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:過(guò)程調(diào)用時(shí),實(shí)參的值會(huì)傳遞給形參。形參被看作是常量,在過(guò)程內(nèi)部不能被修改。
out:過(guò)程調(diào)用時(shí),實(shí)參的值被忽略,形參為null值,在過(guò)程內(nèi)部形參變量可以讀寫。過(guò)程結(jié)束時(shí),形參的值賦值給實(shí)參!
in out:過(guò)程調(diào)用時(shí),實(shí)參的值傳遞給形參,在過(guò)程內(nèi)部形參變量可讀可寫,過(guò)程結(jié)束時(shí),形參的值賦值給實(shí)參。
注意:如果在定義存儲(chǔ)過(guò)程時(shí),沒有指明參數(shù)傳遞模式,則默認(rèn)為 in 模式
【示例】創(chuàng)建一個(gè)有參數(shù)傳遞默認(rèn)的存儲(chǔ)過(guò)程
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)用存儲(chǔ)過(guò)程
declare
v_1 varchar2(5) := 'wwww';
begin
pr_test(v_1);
dbms_output.put_line('v_1='||v_1);
end;
注意:(1)在創(chuàng)建存儲(chǔ)過(guò)程時(shí),形參類型不能指定具體的長(zhǎng)度,字符類型就為 varchar2,數(shù)字類型就是number;默認(rèn)和實(shí)參類型的長(zhǎng)度等同
(2)使用 in 模式,形參接受實(shí)參的值,默認(rèn)形參為常量,在存儲(chǔ)過(guò)程當(dāng)中不能被修改,否則出錯(cuò)!
(3)使用 out 模式,實(shí)參的值被忽略,但必須是變量,用來(lái)接收存儲(chǔ)過(guò)程執(zhí)行完形參的值;而形參是可讀可寫的。
(4)使用 in out 模式,實(shí)參的值傳遞給形參,也必須是變量,形參可讀可寫,最后執(zhí)行完存儲(chǔ)過(guò)程形參的值傳遞給實(shí)參!
(5)參數(shù)傳遞,實(shí)參的值和長(zhǎng)度或精度約束會(huì)傳遞給形參,因此,形參不能有長(zhǎng)度或精度的約束。在過(guò)程中給形參賦值時(shí),要注意它的長(zhǎng)度或精度的限制!
感謝 閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
mybatis使用oracle進(jìn)行添加數(shù)據(jù)的方法
這篇文章主要介紹了mybatis使用oracle進(jìn)行添加數(shù)據(jù)的方法,本文給大家分享我的心得體會(huì),需要的朋友可以參考下2021-04-04
Ubuntu?22.04或20.04安裝Oracle?SQL?Developer的圖文教程
Oracle?SQL?Developer?是一個(gè)免費(fèi)平臺(tái),為開發(fā)人員提供用于開發(fā)和管理?Oracle?數(shù)據(jù)庫(kù)的集成開發(fā)環(huán)境,這篇文章主要介紹了Ubuntu?22.04或20.04安裝Oracle?SQL?Developer圖文教程,需要的朋友可以參考下2024-08-08
解決navicat 鏈接oracle時(shí)出現(xiàn)的各種問(wèn)題
這篇文章主要介紹了解決navicat 鏈接oracle時(shí)出現(xiàn)的各種問(wèn)題,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-08-08
連接oracle報(bào)錯(cuò):ora-28001:the?password?has?expired解決辦法
這篇文章主要給大家介紹了關(guān)于連接oracle報(bào)錯(cuò):ora-28001:the?password?has?expired的解決辦法,當(dāng)遇到ora-28001錯(cuò)誤時(shí),這通常表示提供的密碼不符合Oracle數(shù)據(jù)庫(kù)的密碼策略要求,需要的朋友可以參考下2024-07-07
Oracle?exadata存儲(chǔ)節(jié)點(diǎn)更換內(nèi)存操作及報(bào)錯(cuò)處理方法
在進(jìn)行Oracle?Exadata巡檢時(shí),發(fā)現(xiàn)cell節(jié)點(diǎn)內(nèi)存報(bào)錯(cuò),需確認(rèn)內(nèi)存PN號(hào)及大小,并更換備件,這篇文章主要介紹了Oracle?exadata存儲(chǔ)節(jié)點(diǎn)更換內(nèi)存操作及報(bào)錯(cuò)處理的相關(guān)資料,需要的朋友可以參考下2024-10-10
Oracle查看表操作歷史記錄并恢復(fù)數(shù)據(jù)的方法
Oracle是一種廣泛應(yīng)用于企業(yè)級(jí)數(shù)據(jù)庫(kù)系統(tǒng)的軟件,但在操作過(guò)程中可能會(huì)發(fā)生誤刪除數(shù)據(jù)的情況,這時(shí)就需要進(jìn)行數(shù)據(jù)恢復(fù)操作,這篇文章主要給大家介紹了關(guān)于Oracle查看表操作歷史記錄并恢復(fù)數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下2023-08-08
Oracle數(shù)據(jù)庫(kù)常用命令整理(實(shí)用方法)
這篇文章主要介紹了Oracle數(shù)據(jù)庫(kù)常用命令整理(實(shí)用方法),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06
深入探討:Oracle中如何查詢正鎖表的用戶以及釋放被鎖的表的方法
本篇文章是對(duì)Oracle中查詢正鎖表的用戶以及釋放被鎖的表的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
使用Oracle的Decode函數(shù)進(jìn)行多值判斷
decode函數(shù)比較表達(dá)式和搜索字,如果匹配,返回結(jié)果;如果不匹配,返回default值;如果未定義default值,則返回空值2013-05-05

