oracle過(guò)程如何寫(xiě) oracle過(guò)程怎么執(zhí)行

Oracle數(shù)據(jù)庫(kù)的存儲(chǔ)過(guò)程怎么寫(xiě)?

Oracle存儲(chǔ)過(guò)程基本語(yǔ)法:

10余年的墾利網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。營(yíng)銷(xiāo)型網(wǎng)站的優(yōu)勢(shì)是能夠根據(jù)用戶(hù)設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整墾利建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)從事“墾利網(wǎng)站設(shè)計(jì)”,“墾利網(wǎng)站推廣”以來(lái),每個(gè)客戶(hù)項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

CREATE?OR?REPLACE?PROCEDURE?存儲(chǔ)過(guò)程名?

IS?

BEGIN?

NULL;?

END;

解釋?zhuān)?/p>

行1:?

CREATE OR REPLACE PROCEDURE 是一個(gè)SQL語(yǔ)句通知Oracle數(shù)據(jù)庫(kù)去創(chuàng)建一個(gè)叫做skeleton存儲(chǔ)過(guò)程, 如果存在就覆蓋它;?

行2:?

IS關(guān)鍵詞表明后面將跟隨一個(gè)PL/SQL體。?

行3:?

BEGIN關(guān)鍵詞表明PL/SQL體的開(kāi)始。?

行4:?

NULL PL/SQL語(yǔ)句表明什么事都不做,這句不能刪去,因?yàn)镻L/SQL體中至少需要有一句;?

行5:?

END關(guān)鍵詞表明PL/SQL體的結(jié)束。

oracle中的存儲(chǔ)過(guò)程怎么寫(xiě)

Oracle存儲(chǔ)過(guò)程寫(xiě)法實(shí)例

總結(jié)項(xiàng)目中寫(xiě)的存儲(chǔ)過(guò)程例子:

Oracle存儲(chǔ)過(guò)程基本語(yǔ)法 存儲(chǔ)過(guò)程

1 CREATE OR REPLACE PROCEDURE 存儲(chǔ)過(guò)程名

2 IS/AS

3 BEGIN

4 NULL;

5 EXCEIPTION;

6 END;

1、創(chuàng)建存儲(chǔ)過(guò)程,后面可用is或者as:

create or replace procedure PRO_COMPLAIN_TEMPLATE as

2、定義變量,此處用到了%TYPE和%ROWTYPE,參考 /database/201211/168564.html ,另外定義了一個(gè)游標(biāo),TEM_INSTANCE TEMPLATE_CUR%ROWTYPE這個(gè)類(lèi)型定義必須要在游標(biāo)定義之后:

NEED_DO_FOR_ZL INTEGER;

CURRENT_MAX_ID MEMO_TEMPLET.TEMPLET_ID%TYPE;

CURSOR TEMPLATE_CUR IS SELECT TEMPLET_NAME, TEMPLET_CONTENT FROM SYS_COMPLAINT_TEMPLET;

TEM_INSTANCE TEMPLATE_CUR%ROWTYPE;

3、begin開(kāi)始?jí)K:

begin

4、該插入語(yǔ)句使用了DBLINK,還有使用DBMS_OUTPUT.put_line('打印信息')進(jìn)行信息輸出:

insert into MEMO_TEMPLET (TEMPLET_ID, TEMPLET_CONTENT, TEMPLET_TYPE, TEMPLET_MEMO) (SELECT * FROM MEMO_TEMPLET@COMPANY);

SELECT COUNT(*) INTO NEED_DO_FOR_ZL FROM SYS_COMPLAINT_TEMPLET;

IF(NEED_DO_FOR_ZL 0) THEN

DBMS_OUTPUT.put_line('打印信息');

SELECT MAX(TEMPLET_ID)+1 INTO CURRENT_MAX_ID FROM MEMO_TEMPLET;

DBMS_OUTPUT.put_line('MEMO_TEMPLET最大ID' || CURRENT_MAX_ID);

FOR TEM_INSTANCE IN TEMPLATE_CUR LOOP

INSERT INTO MEMO_TEMPLET (TEMPLET_ID, TEMPLET_CONTENT,

TEMPLET_TYPE, TEMPLET_MEMO) VALUES (CURRENT_MAX_ID,

TEM_INSTANCE.TEMPLET_CONTENT, '7', NULL);

CURRENT_MAX_ID := CURRENT_MAX_ID + 1;

DBMS_OUTPUT.put_line(TEM_INSTANCE.TEMPLET_CONTENT);

END LOOP;

END IF;

COMMIT;

4、exception塊,使用WHEN OTHERS THEN,其中用raise可顯示錯(cuò)誤信息:

exception

WHEN OTHERS THEN

DBMS_OUTPUT.put_line('sqlcode : ' ||sqlcode);

raise;

ROLLBACK;

IF TEMPLATE_CUR%ISOPEN THEN

CLOSE TEMPLATE_CUR;

END IF;

DBMS_OUTPUT.put_line('打印信息');

end;

注:關(guān)于游標(biāo)的使用,如果像本例中使用for循環(huán)去遍歷游標(biāo)的話(huà)則不需要顯式的去用open/close

cursor打開(kāi)和關(guān)閉游標(biāo),此處會(huì)自己處理,如果使用fetch

into的話(huà)就需要顯式開(kāi)關(guān)游標(biāo),另外任意執(zhí)行一個(gè)update操作,用隱式游標(biāo)sql的屬性%found,%notfound,%rowcount,%isopen觀察update語(yǔ)句的執(zhí)行情況,也可以使用來(lái)判斷游標(biāo)狀態(tài),如IF

TEMPLATE_CUR%ISOPEN THEN。

Oracle存儲(chǔ)過(guò)程編寫(xiě)

Oracle存儲(chǔ)過(guò)程基本語(yǔ)法:

CREATE?OR?REPLACE?PROCEDURE?存儲(chǔ)過(guò)程名?

IS?

BEGIN?

NULL;?

END;解釋?zhuān)?/p>

行1:?

CREATE OR REPLACE PROCEDURE 是一個(gè)SQL語(yǔ)句通知Oracle數(shù)據(jù)庫(kù)去創(chuàng)建一個(gè)叫做skeleton存儲(chǔ)過(guò)程, 如果存在就覆蓋它;?

行2:?

IS關(guān)鍵詞表明后面將跟隨一個(gè)PL/SQL體。?

行3:?

BEGIN關(guān)鍵詞表明PL/SQL體的開(kāi)始。?

行4:?

NULL PL/SQL語(yǔ)句表明什么事都不做,這句不能刪去,因?yàn)镻L/SQL體中至少需要有一句;?

行5:?

END關(guān)鍵詞表明PL/SQL體的結(jié)束。

oracle存儲(chǔ)過(guò)程基本語(yǔ)法

一:存儲(chǔ)過(guò)程

創(chuàng)建存儲(chǔ)過(guò)程,需要有CREATE PROCEDURE或CREATE ANY PROCEDURE的系統(tǒng)權(quán)限? ?

刪除存儲(chǔ)過(guò)程,是過(guò)程的創(chuàng)建者或者擁有DROP ANY PROCEDURE系統(tǒng)權(quán)限?

修改存儲(chǔ)過(guò)程,則只能是過(guò)程的創(chuàng)建者或者擁有ALTER ANY PROCEDURE系統(tǒng)權(quán)限的人

執(zhí)行(或調(diào)用)存儲(chǔ)過(guò)程,是過(guò)程的創(chuàng)建者或是擁有EXECUTE ANY PROCEDURE系統(tǒng)權(quán)限的人或是被擁有者授予EXECUTE權(quán)限的人

1:語(yǔ)法

1)創(chuàng)建

CREATE[ORREPLACE]PROCEDURE存儲(chǔ)過(guò)程名[(參數(shù)[IN|OUT|INOUT] 數(shù)據(jù)類(lèi)型...)]

{AS|IS}

[說(shuō)明部分]

BEGIN

可執(zhí)行部分

[EXCEPTION

錯(cuò)誤處理部分]

END[過(guò)程名];

說(shuō)明:

OR REPLACE?表示如果存在就覆蓋存儲(chǔ)過(guò)程

參數(shù)有三種形式:IN、OUT和IN OUT。則默認(rèn)為IN。

關(guān)鍵字AS也可以寫(xiě)成IS,后跟過(guò)程的說(shuō)明部分,可以在此定義過(guò)程的局部變量。

2)刪除存儲(chǔ)過(guò)程:

DROP PROCEDURE 存儲(chǔ)過(guò)程名;

3)修改存儲(chǔ)過(guò)程:

? ALTER PROCEDURE 存儲(chǔ)過(guò)程名 COMPILE;?

4)執(zhí)行存儲(chǔ)過(guò)程

??EXECUTE 模式名.存儲(chǔ)過(guò)程名[(參數(shù)...)];?

?或

? ?BEGIN?

模式名.存儲(chǔ)過(guò)程名[(參數(shù)...)];

END;

另外:參數(shù)可以是變量、常量或表達(dá)式

要其它用戶(hù)執(zhí)行存儲(chǔ)過(guò)程須要給其它用戶(hù)授權(quán)

GRANT EXECUTE ON 存儲(chǔ)過(guò)程名 TO 用戶(hù)名

2:參數(shù)說(shuō)明

IN 定義一個(gè)輸入?yún)?shù)變量,用于傳遞參數(shù)給存儲(chǔ)過(guò)程

OUT 定義一個(gè)輸出參數(shù)變量,用于從存儲(chǔ)過(guò)程獲取數(shù)據(jù)

IN OUT 定義一個(gè)輸入、輸出參數(shù)變量,兼有以上兩者的功能

1)參數(shù)名 IN 數(shù)據(jù)類(lèi)型 DEFAULT 值;

? ? ??定義一個(gè)輸入?yún)?shù)變量,用于傳遞參數(shù)給存儲(chǔ)過(guò)程。

? ? ??可以是常量、有值變量或表達(dá)式

? ? ??DEFAULT 關(guān)鍵字為可選項(xiàng),用來(lái)設(shè)定參數(shù)的默認(rèn)值。如果在調(diào)用存儲(chǔ)過(guò)程時(shí)不指明參數(shù),則參數(shù)變量取默認(rèn)值

? ? ??在存儲(chǔ)過(guò)程中,輸入變量接收主程序傳遞的值,但不能對(duì)其進(jìn)行賦值。

2)參數(shù)名 OUT 數(shù)據(jù)類(lèi)型;

? ? ??定義一個(gè)輸出參數(shù)變量,用于從存儲(chǔ)過(guò)程獲取數(shù)據(jù),即變量從存儲(chǔ)過(guò)程中返回值給主程序。

? ? ? 在調(diào)用存儲(chǔ)過(guò)程時(shí),主程序的實(shí)際參數(shù)只能是一個(gè)變量,而不能是常量或表達(dá)式。

? ? ??在存儲(chǔ)過(guò)程中,參數(shù)變量只能被賦值而不能將其用于賦值,而且必須給輸出變量至少賦值一次。

3)參數(shù)名 IN OUT 數(shù)據(jù)類(lèi)型 DEFAULT 值;?

? ? ??定義一個(gè)輸入、輸出參數(shù)變量,兼有以上兩者的功能。

? ? ??在調(diào)用存儲(chǔ)過(guò)程時(shí),主程序的實(shí)際參數(shù)只能是一個(gè)變量,而不能是常量或表達(dá)式。

? ? ??DEFAULT 關(guān)鍵字為可選項(xiàng),用來(lái)設(shè)定參數(shù)的默認(rèn)值。

? ? ??在存儲(chǔ)過(guò)程中,變量接收主程序傳遞的值,同時(shí)可以參加賦值運(yùn)算,也可以對(duì)其進(jìn)行賦值。在存儲(chǔ)過(guò)程中必須給變量至少賦值一次。

補(bǔ)充:如果省略IN、OUT或IN OUT,則默認(rèn)模式是IN。?

? ? ? 調(diào)用它時(shí)參數(shù)個(gè)數(shù)與位置可以不一致,用以下形式調(diào)用:

EXECUTE CHANGE_SALARY(P_RAISE=80,P_EMPNO=7788); ?//=運(yùn)算符左側(cè)是參數(shù)名,右側(cè)是參數(shù)表達(dá)式

二:函數(shù)

創(chuàng)建函數(shù),需要有CREATE PROCEDURE或CREATE ANY PROCEDURE的系統(tǒng)權(quán)限

刪除函數(shù),需要是函數(shù)的創(chuàng)建者或者是擁有DROP ANY PROCEDURE系統(tǒng)權(quán)限的人

修改函數(shù),需要是函數(shù)的創(chuàng)建者或者擁有ALTER ANY PROCEDURE系統(tǒng)權(quán)限的人

執(zhí)行函數(shù),需要是函數(shù)的創(chuàng)建者或擁有EXECUTE ANY PROCEDURE系統(tǒng)權(quán)限的人

1:語(yǔ)法

1)創(chuàng)建:

CREATE[ORREPLACE]FUNCTION函數(shù)名[(參數(shù)[IN] 數(shù)據(jù)類(lèi)型...)]

RETURN數(shù)據(jù)類(lèi)型

{AS|IS}

[說(shuō)明部分]

BEGIN

可執(zhí)行部分

RETURN(表達(dá)式)

[EXCEPTION

錯(cuò)誤處理部分]

END[函數(shù)名];

說(shuō)明:

?參數(shù)是可選的,但只能是IN類(lèi)型(IN關(guān)鍵字可以省略)。

?在定義部分的RETURN 數(shù)據(jù)類(lèi)型,用來(lái)表示函數(shù)的數(shù)據(jù)類(lèi)型,也就是返回值的類(lèi)型,不可省略。

?在可執(zhí)行部分的RETURN(表達(dá)式),用來(lái)生成函數(shù)的返回值,其表達(dá)式的類(lèi)型應(yīng)該和定義部分說(shuō)明的函數(shù)返回值的數(shù)據(jù)類(lèi)型一致。在函數(shù)的執(zhí)行部分可以有多個(gè)RETURN語(yǔ)句,但只有一個(gè)RETURN語(yǔ)句會(huì)被執(zhí)行,一旦執(zhí)行了RETURN語(yǔ)句,則函數(shù)結(jié)束并返回調(diào)用環(huán)境。?

2)刪除

??DROP FUNCTION 函數(shù)名;

3)修改

??ALTER PROCEDURE 函數(shù)名 COMPILE;

4)執(zhí)行

??變量名:=函數(shù)名(...)?

三:對(duì)存儲(chǔ)過(guò)程 和 函數(shù)的查看(可以通過(guò)對(duì)數(shù)據(jù)字典【USER_SOURCE】的訪問(wèn)來(lái)查詢(xún)存儲(chǔ)過(guò)程或函數(shù)的有關(guān)信息)

1:查詢(xún)某個(gè)存儲(chǔ)過(guò)程序內(nèi)容

select TEXT from user_source WHERE NAME='存儲(chǔ)過(guò)程名';

2:查看數(shù)據(jù)字殿

DESCRIBE USER_SOURCE ; //命令行中

3:查看存儲(chǔ)過(guò)程的參數(shù)

DESCRIBE say_hello; //后面是過(guò)程名

4:查看發(fā)生編輯錯(cuò)誤

SHOW ERRORS ;

5:查詢(xún)一個(gè)存儲(chǔ)過(guò)程或函數(shù)是否是有效狀態(tài)(即編譯成功)

SELECT STATUS FROM USER_OBJECTS WHERE OBJECT_NAME='過(guò)程名';//注意大小寫(xiě)

VALID表示該存儲(chǔ)過(guò)程有效(即通過(guò)編譯),INVALID表示存儲(chǔ)過(guò)程無(wú)效或需要重新編譯。它的狀態(tài)會(huì)改變,這與它依賴(lài)外部表(表刪除修改等操作)有關(guān)系

6:查看存儲(chǔ)過(guò)程與表的依賴(lài)關(guān)系

SELECT REFERENCED_NAME,REFERENCED_TYPE FROM USER_DEPENDENCIES WHERE NAME='SAY_HELLO';

說(shuō)明

NAME為實(shí)體名,TYPE為實(shí)體類(lèi)型,REFERENCED_OWNER為涉及到的實(shí)體擁有者賬戶(hù),REFERENCED_NAME為涉及到的實(shí)體名,REFERENCED_TYPE 為涉及到的實(shí)體類(lèi)型。

問(wèn)題:

如果一個(gè)用戶(hù)A被授予執(zhí)行屬于用戶(hù)B的一個(gè)存儲(chǔ)過(guò)程的權(quán)限,在用戶(hù)B的存儲(chǔ)過(guò)程中,訪問(wèn)到用戶(hù)C的表,用戶(hù)B被授予訪問(wèn)用戶(hù)C的表的權(quán)限,但用戶(hù)A沒(méi)有被授予訪問(wèn)用戶(hù)C表的權(quán)限,那么用戶(hù)A調(diào)用用戶(hù)B的存儲(chǔ)過(guò)程是失敗的還是成功的呢?答案是成功的。

網(wǎng)頁(yè)名稱(chēng):oracle過(guò)程如何寫(xiě) oracle過(guò)程怎么執(zhí)行
轉(zhuǎn)載注明:http://muchs.cn/article12/hgesgc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、面包屑導(dǎo)航、定制網(wǎng)站、網(wǎng)頁(yè)設(shè)計(jì)公司標(biāo)簽優(yōu)化、外貿(mào)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司