oracle
公司主營(yíng)業(yè)務(wù):成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、移動(dòng)網(wǎng)站開(kāi)發(fā)等業(yè)務(wù)。幫助企業(yè)客戶(hù)真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。成都創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開(kāi)放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶(hù)帶來(lái)驚喜。成都創(chuàng)新互聯(lián)推出海滄免費(fèi)做網(wǎng)站回饋大家。
存儲(chǔ)過(guò)程的基本語(yǔ)法
1.基本結(jié)構(gòu)
CREATE
OR
REPLACE
PROCEDURE
存儲(chǔ)過(guò)程名字
(
參數(shù)1
IN
NUMBER,
參數(shù)2
IN
NUMBER
)
IS
變量1
INTEGER
:=0;
變量2
DATE;
BEGIN
END
存儲(chǔ)過(guò)程名字
2.SELECT
INTO
STATEMENT
將select查詢(xún)的結(jié)果存入到變量中,可以同時(shí)將多個(gè)列存儲(chǔ)多個(gè)變量中,必須有一條
記錄,否則拋出異常(如果沒(méi)有記錄拋出NO_DATA_FOUND)
例子:
BEGIN
SELECT
col1,col2
into
變量1,變量2
FROM
typestruct
where
xxx;
EXCEPTION
WHEN
NO_DATA_FOUND
THEN
xxxx;
END;
...
3.IF
判斷
IF
V_TEST=1
THEN
BEGIN
do
something
END;
END
IF;
4.while
循環(huán)
WHILE
V_TEST=1
LOOP
BEGIN
XXXX
END;
END
LOOP;
5.變量賦值
V_TEST
:=
123;
6.用for
in
使用cursor
...
IS
CURSOR
cur
IS
SELECT
*
FROM
xxx;
BEGIN
FOR
cur_result
in
cur
LOOP
BEGIN
V_SUM
:=cur_result.列名1+cur_result.列名2
END;
END
LOOP;
END;
7.帶參數(shù)的cursor
CURSOR
C_USER(C_ID
NUMBER)
IS
SELECT
NAME
FROM
USER
WHERE
TYPEID=C_ID;
OPEN
C_USER(變量值);
LOOP
FETCH
C_USER
INTO
V_NAME;
EXIT
FETCH
C_USER%NOTFOUND;
do
something
END
LOOP;
CLOSE
C_USER;
8.用pl/sql
developer
debug
連接數(shù)據(jù)庫(kù)后建立一個(gè)Test
WINDOW
在窗口輸入調(diào)用SP的代碼,F9開(kāi)始debug,CTRL+N單步調(diào)試
一:存儲(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ò)程是失敗的還是成功的呢?答案是成功的。
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é)束。
sqlplus 中直接敲入存儲(chǔ)過(guò)程代碼(create or replace procedure ...), / 結(jié)束,\x0d\x0a如果代碼沒(méi)有錯(cuò)誤,該過(guò)程就被保存到數(shù)據(jù)庫(kù)中。 \x0d\x0a可以用 exec 過(guò)程名 運(yùn)行。\x0d\x0a\x0d\x0a如果是plsql developer之類(lèi)的工具,那更簡(jiǎn)單,編輯完存儲(chǔ)過(guò)程后,有運(yùn)行按鈕,點(diǎn)擊即可。
你首先要了解存儲(chǔ)過(guò)程包括哪些模塊,哪些是必備的,哪些是可選的.\x0d\x0a另外呢,如果有條件的話,最好能找一些模板看看別人是怎么寫(xiě)的,再結(jié)合你們公司的實(shí)際情況,做一些適當(dāng)?shù)恼{(diào)整.\x0d\x0a例如create or replace procedure +過(guò)程名字(變量名 in,數(shù)據(jù)類(lèi)型,變量名 out 數(shù)據(jù)類(lèi)型)等\x0d\x0adeclare\x0d\x0a變量 類(lèi)型\x0d\x0abegin\x0d\x0a過(guò)程體\x0d\x0aexception\x0d\x0aend\x0d\x0a等\x0d\x0a最好有些實(shí)例,可以先模仿著寫(xiě)一寫(xiě)\x0d\x0a等熟練之后呢,再自己按照自己的思路去寫(xiě)