oracle区号,Oracle 存儲過程
1.創(chuàng)建和刪除存儲(chǔ)過程
創(chuàng)建存儲(chǔ)過程,需要有CREATE PROCEDURE或CREATE ANY PROCEDURE的系統(tǒng)權(quán)限。該權(quán)限可由系統(tǒng)管理員授予。創(chuàng)建一個(gè)存儲(chǔ)過程的基本語句如下:
CREATE [OR REPLACE] PROCEDURE 存儲(chǔ)過程名[(參數(shù)[IN|OUT|IN OUT] 數(shù)據(jù)類型...)]
{AS|IS}
[說明部分]
BEGIN
可執(zhí)行部分
[EXCEPTION
錯(cuò)誤處理部分]
END [過程名];
其中:
可選關(guān)鍵字OR REPLACE 表示如果存儲(chǔ)過程已經(jīng)存在,則用新的存儲(chǔ)過程覆蓋,通常用于存儲(chǔ)過程的重建。
參數(shù)部分用于定義多個(gè)參數(shù)(如果沒有參數(shù),就可以省略)。參數(shù)有三種形式:IN、OUT和IN OUT。如果沒有指明參數(shù)的形式,則默認(rèn)為IN。
關(guān)鍵字AS也可以寫成IS,后跟過程的說明部分,可以在此定義過程的局部變量。
編寫存儲(chǔ)過程可以使用任何文本編輯器或直接在SQL*Plus環(huán)境下進(jìn)行,編寫好的存儲(chǔ)過程必須要在SQL*Plus環(huán)境下進(jìn)行編譯,生成編譯代碼,原代碼和編譯代碼在編譯過程中都會(huì)被存入數(shù)據(jù)庫。編譯成功的存儲(chǔ)過程就可以在Oracle環(huán)境下進(jìn)行調(diào)用了。
一個(gè)存儲(chǔ)過程在不需要時(shí)可以刪除。刪除存儲(chǔ)過程的人是過程的創(chuàng)建者或者擁有DROP ANY PROCEDURE系統(tǒng)權(quán)限的人。刪除存儲(chǔ)過程的語法如下:
DROP PROCEDURE 存儲(chǔ)過程名;
如果要重新編譯一個(gè)存儲(chǔ)過程,則只能是過程的創(chuàng)建者或者擁有ALTER ANY PROCEDURE系統(tǒng)權(quán)限的人。語法如下:
ALTER PROCEDURE 存儲(chǔ)過程名 COMPILE;
執(zhí)行(或調(diào)用)存儲(chǔ)過程的人是過程的創(chuàng)建者或是擁有EXECUTE ANY PROCEDURE系統(tǒng)權(quán)限的人或是被擁有者授予EXECUTE權(quán)限的人。執(zhí)行的方法如下:
方法1:
EXECUTE 模式名.存儲(chǔ)過程名[(參數(shù)...)];
方法2:
BEGIN
模式名.存儲(chǔ)過程名[(參數(shù)...)];
END;
傳遞的參數(shù)必須與定義的參數(shù)類型、個(gè)數(shù)和順序一致(如果參數(shù)定義了默認(rèn)值,則調(diào)用時(shí)可以省略參數(shù))。參數(shù)可以是變量、常量或表達(dá)式,用法參見下一節(jié)。
如果是調(diào)用本賬戶下的存儲(chǔ)過程,則模式名可以省略。要調(diào)用其他賬戶編寫的存儲(chǔ)過程,則模式名必須要添加。
以下是一個(gè)生成和調(diào)用簡單存儲(chǔ)過程的訓(xùn)練。注意要事先授予創(chuàng)建存儲(chǔ)過程的權(quán)限。
【訓(xùn)練1】? 創(chuàng)建一個(gè)顯示雇員總?cè)藬?shù)的存儲(chǔ)過程。
步驟1:登錄SCOTT賬戶(或?qū)W生個(gè)人賬戶)。
步驟2:在SQL*Plus輸入?yún)^(qū)中,輸入以下存儲(chǔ)過程:
CREATE OR REPLACE PROCEDURE EMP_COUNT
AS
V_TOTAL NUMBER(10);
BEGIN
SELECT COUNT(*) INTO V_TOTAL FROM EMP;
DBMS_OUTPUT.PUT_LINE('雇員總?cè)藬?shù)為:'||V_TOTAL);
END;
步驟3:按“執(zhí)行”按鈕進(jìn)行編譯。
如果存在錯(cuò)誤,就會(huì)顯示:
警告: 創(chuàng)建的過程帶有編譯錯(cuò)誤。
如果存在錯(cuò)誤,對(duì)腳本進(jìn)行修改,直到?jīng)]有錯(cuò)誤產(chǎn)生。
如果編譯結(jié)果正確,將顯示:
過程已創(chuàng)建。
步驟4:調(diào)用存儲(chǔ)過程,在輸入?yún)^(qū)中輸入以下語句并執(zhí)行:
EXECUTE EMP_COUNT;
顯示結(jié)果為:
雇員總?cè)藬?shù)為:14
PL/SQL 過程已成功完成。
說明:在該訓(xùn)練中,V_TOTAL變量是存儲(chǔ)過程定義的局部變量,用于接收查詢到的雇員總?cè)藬?shù)。
注意:在SQL*Plus中輸入存儲(chǔ)過程,按“執(zhí)行”按鈕是進(jìn)行編譯,不是執(zhí)行存儲(chǔ)過程。
如果在存儲(chǔ)過程中引用了其他用戶的對(duì)象,比如表,則必須有其他用戶授予的對(duì)象訪問權(quán)限。一個(gè)存儲(chǔ)過程一旦編譯成功,就可以由其他用戶或程序來引用。但存儲(chǔ)過程或函數(shù)的所有者必須授予其他用戶執(zhí)行該過程的權(quán)限。
存儲(chǔ)過程沒有參數(shù),在調(diào)用時(shí),直接寫過程名即可。
【訓(xùn)練2】? 在PL/SQL程序中調(diào)用存儲(chǔ)過程。
步驟1:登錄SCOTT賬戶。
步驟2:授權(quán)STUDENT賬戶使用該存儲(chǔ)過程,即在SQL*Plus輸入?yún)^(qū)中,輸入以下的命令:
GRANT EXECUTE ON EMP_COUNT TO STUDENT
授權(quán)成功。
步驟3:登錄STUDENT賬戶,在SQL*Plus輸入?yún)^(qū)中輸入以下程序:
SET SERVEROUTPUT ON
BEGIN
SCOTT.EMP_COUNT;
END;
步驟4:執(zhí)行以上程序,結(jié)果為:
雇員總?cè)藬?shù)為:14
PL/SQL 過程已成功完成。
說明:在本例中,存儲(chǔ)過程是由SCOTT賬戶創(chuàng)建的,STUDEN賬戶獲得SCOTT賬戶的授權(quán)后,才能調(diào)用該存儲(chǔ)過程。
注意:在程序中調(diào)用存儲(chǔ)過程,使用了第二種語法。
【訓(xùn)練3】? 編寫顯示雇員信息的存儲(chǔ)過程EMP_LIST,并引用EMP_COUNT存儲(chǔ)過程。
步驟1:在SQL*Plus輸入?yún)^(qū)中輸入并編譯以下存儲(chǔ)過程:
CREATE OR REPLACE PROCEDURE EMP_LIST
AS
CURSOR emp_cursor IS
SELECT empno,ename FROM emp;
BEGIN
FOR Emp_record IN emp_cursor LOOP
DBMS_OUTPUT.PUT_LINE(Emp_record.empno||Emp_record.ename);
END LOOP;
EMP_COUNT;
END;
執(zhí)行結(jié)果:
過程已創(chuàng)建。
步驟2:調(diào)用存儲(chǔ)過程,在輸入?yún)^(qū)中輸入以下語句并執(zhí)行:
EXECUTE EMP_LIST
顯示結(jié)果為:
7369SMITH
7499ALLEN
7521WARD
7566JONES
執(zhí)行結(jié)果:
雇員總?cè)藬?shù)為:14
PL/SQL 過程已成功完成。
說明:以上的EMP_LIST存儲(chǔ)過程中定義并使用了游標(biāo),用來循環(huán)顯示所有雇員的信息。然后調(diào)用已經(jīng)成功編譯的存儲(chǔ)過程EMP_COUNT,用來附加顯示雇員總?cè)藬?shù)。通過EXECUTE命令來執(zhí)行EMP_LIST存儲(chǔ)過程。
【練習(xí)1】編寫顯示部門信息的存儲(chǔ)過程DEPT_LIST,要求統(tǒng)計(jì)出部門個(gè)數(shù)。
2? 參數(shù)傳遞
參數(shù)的作用是向存儲(chǔ)過程傳遞數(shù)據(jù),或從存儲(chǔ)過程獲得返回結(jié)果。正確的使用參數(shù)可以大大增加存儲(chǔ)過程的靈活性和通用性。
參數(shù)的類型有三種,如下所示。
in? 傳入?yún)?shù),默認(rèn)值
out輸出參數(shù)
inout定義一個(gè)輸入輸出參數(shù),在賦值時(shí)為輸入?yún)?shù),輸出時(shí)為輸出參數(shù)
參數(shù)的定義形式和作用如下:
參數(shù)名 IN 數(shù)據(jù)類型 DEFAULT 值;
定義一個(gè)輸入?yún)?shù)變量,用于傳遞參數(shù)給存儲(chǔ)過程。在調(diào)用存儲(chǔ)過程時(shí),主程序的實(shí)際參數(shù)可以是常量、有值變量或表達(dá)式等。DEFAULT 關(guān)鍵字為可選項(xiàng),用來設(shè)定參數(shù)的默認(rèn)值。如果在調(diào)用存儲(chǔ)過程時(shí)不指明參數(shù),則參數(shù)變量取默認(rèn)值。在存儲(chǔ)過程中,輸入變量接收主程序傳遞的值,但不能對(duì)其進(jìn)行賦值。
參數(shù)名 OUT 數(shù)據(jù)類型;
定義一個(gè)輸出參數(shù)變量,用于從存儲(chǔ)過程獲取數(shù)據(jù),即變量從存儲(chǔ)過程中返回值給主程序。
在調(diào)用存儲(chǔ)過程時(shí),主程序的實(shí)際參數(shù)只能是一個(gè)變量,而不能是常量或表達(dá)式。在存儲(chǔ)過程中,參數(shù)變量只能被賦值而不能將其用于賦值,在存儲(chǔ)過程中必須給輸出變量至少賦值一次。
參數(shù)名 IN OUT 數(shù)據(jù)類型 DEFAULT 值;
定義一個(gè)輸入、輸出參數(shù)變量,兼有以上兩者的功能。在調(diào)用存儲(chǔ)過程時(shí),主程序的實(shí)際參數(shù)只能是一個(gè)變量,而不能是常量或表達(dá)式。DEFAULT 關(guān)鍵字為可選項(xiàng),用來設(shè)定參數(shù)的默認(rèn)值。在存儲(chǔ)過程中,變量接收主程序傳遞的值,同時(shí)可以參加賦值運(yùn)算,也可以對(duì)其進(jìn)行賦值。在存儲(chǔ)過程中必須給變量至少賦值一次。
如果省略IN、OUT或IN OUT,則默認(rèn)模式是IN。
【訓(xùn)練1】? 編寫給雇員增加工資的存儲(chǔ)過程CHANGE_SALARY,通過IN類型的參數(shù)傳遞要增加工資的雇員編號(hào)和增加的工資額。
步驟1:登錄SCOTT賬戶。
步驟2:在SQL*Plus輸入?yún)^(qū)中輸入以下存儲(chǔ)過程并執(zhí)行:
CREATE OR REPLACE PROCEDURE CHANGE_SALARY(P_EMPNO IN NUMBER DEFAULT 7788,P_RAISE NUMBER DEFAULT 10)
AS
V_ENAME VARCHAR2(10);
V_SAL NUMBER(5);
BEGIN
SELECT ENAME,SAL INTO V_ENAME,V_SAL FROM EMP WHERE EMPNO=P_EMPNO;
UPDATE EMP SET SAL=SAL+P_RAISE WHERE EMPNO=P_EMPNO;
DBMS_OUTPUT.PUT_LINE('雇員'||V_ENAME||'的工資被改為'||TO_CHAR(V_SAL+P_RAISE));
COMMIT;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('發(fā)生錯(cuò)誤,修改失敗!');
ROLLBACK;
END;
執(zhí)行結(jié)果為:
過程已創(chuàng)建。
步驟3:調(diào)用存儲(chǔ)過程,在輸入?yún)^(qū)中輸入以下語句并執(zhí)行:
EXECUTE CHANGE_SALARY(7788,80)
顯示結(jié)果為:
雇員SCOTT的工資被改為3080
說明:從執(zhí)行結(jié)果可以看到,雇員SCOTT的工資已由原來的3000改為3080。
參數(shù)的值由調(diào)用者傳遞,傳遞的參數(shù)的個(gè)數(shù)、類型和順序應(yīng)該和定義的一致。如果順序不一致,可以采用以下調(diào)用方法。如上例,執(zhí)行語句可以改為:
EXECUTE CHANGE_SALARY(P_RAISE=>80,P_EMPNO=>7788);
可以看出傳遞參數(shù)的順序發(fā)生了變化,并且明確指出了參數(shù)名和要傳遞的值,=>運(yùn)算符左側(cè)是參數(shù)名,右側(cè)是參數(shù)表達(dá)式,這種賦值方法的意義較清楚。
【練習(xí)1】創(chuàng)建插入雇員的存儲(chǔ)過程INSERT_EMP,并將雇員編號(hào)等作為參數(shù)。
在設(shè)計(jì)存儲(chǔ)過程的時(shí)候,也可以為參數(shù)設(shè)定默認(rèn)值,這樣調(diào)用者就可以不傳遞或少傳遞參數(shù)了。
【訓(xùn)練2】? 調(diào)用存儲(chǔ)過程CHANGE_SALARY,不傳遞參數(shù),使用默認(rèn)參數(shù)值。
在SQL*Plus輸入?yún)^(qū)中輸入以下命令并執(zhí)行:
EXECUTE CHANGE_SALARY
顯示結(jié)果為:
雇員SCOTT的工資被改為3090
說明:在存儲(chǔ)過程的調(diào)用中沒有傳遞參數(shù),而是采用了默認(rèn)值7788和10,即默認(rèn)雇員號(hào)為7788,增加的工資為10。
【訓(xùn)練3】? 使用OUT類型的參數(shù)返回存儲(chǔ)過程的結(jié)果。
步驟1:登錄SCOTT賬戶。
步驟2:在SQL*Plus輸入?yún)^(qū)中輸入并編譯以下存儲(chǔ)過程:
CREATE OR REPLACE PROCEDURE EMP_COUNT(P_TOTAL OUT NUMBER)
AS
BEGIN
SELECT COUNT(*) INTO P_TOTAL FROM EMP;
END;
執(zhí)行結(jié)果為:
過程已創(chuàng)建。
步驟3:輸入以下程序并執(zhí)行:
DECLARE
V_EMPCOUNT NUMBER;
BEGIN
EMP_COUNT(V_EMPCOUNT);
DBMS_OUTPUT.PUT_LINE('雇員總?cè)藬?shù)為:'||V_EMPCOUNT);
END;
顯示結(jié)果為:
雇員總?cè)藬?shù)為:14
PL/SQL 過程已成功完成。
說明:在存儲(chǔ)過程中定義了OUT類型的參數(shù)P_TOTAL,在主程序調(diào)用該存儲(chǔ)過程時(shí),傳遞了參數(shù)V_EMPCOUNT。在存儲(chǔ)過程中的SELECT...INTO...語句中對(duì)P_TOTAL進(jìn)行賦值,賦值結(jié)果由V_EMPCOUNT變量帶回給主程序并顯示。
以上程序要覆蓋同名的EMP_COUNT存儲(chǔ)過程,如果不使用OR REPLACE選項(xiàng),就會(huì)出現(xiàn)以下錯(cuò)誤:
ERROR 位于第 1 行:
ORA-00955: 名稱已由現(xiàn)有對(duì)象使用。
【練習(xí)2】創(chuàng)建存儲(chǔ)過程,使用OUT類型參數(shù)獲得雇員經(jīng)理名。
【訓(xùn)練4】? 使用IN OUT類型的參數(shù),給電話號(hào)碼增加區(qū)碼。
步驟1:登錄SCOTT賬戶。
步驟2:在SQL*Plus輸入?yún)^(qū)中輸入并編譯以下存儲(chǔ)過程:
CREATE OR REPLACE PROCEDURE ADD_REGION(P_HPONE_NUM IN OUT VARCHAR2)
AS
BEGIN
P_HPONE_NUM:='0755-'||P_HPONE_NUM;
END;
執(zhí)行結(jié)果為:
過程已創(chuàng)建。
步驟3:輸入以下程序并執(zhí)行:
SET SERVEROUTPUT ON
DECLARE
V_PHONE_NUM VARCHAR2(15);
BEGIN
V_PHONE_NUM:='26731092';
ADD_REGION(V_PHONE_NUM);
DBMS_OUTPUT.PUT_LINE('新的電話號(hào)碼:'||V_PHONE_NUM);
END;
顯示結(jié)果為:
新的電話號(hào)碼:0755-26731092
PL/SQL 過程已成功完成。
說明:變量V_HPONE_NUM既用來向存儲(chǔ)過程傳遞舊電話號(hào)碼,也用來向主程序返回新號(hào)碼。新的號(hào)碼在原來基礎(chǔ)上增加了區(qū)號(hào)0755和-。
總結(jié)
以上是生活随笔為你收集整理的oracle区号,Oracle 存儲過程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle 12c安装psu,Orac
- 下一篇: oracle的rman备份保留天数,RM