日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

oracle区号,Oracle 存儲過程

發(fā)布時(shí)間:2025/3/20 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle区号,Oracle 存儲過程 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。