一:存儲(chǔ)過(guò)程
作為一家“創(chuàng)意+整合+營(yíng)銷(xiāo)”的成都網(wǎng)站建設(shè)機(jī)構(gòu),我們?cè)跇I(yè)內(nèi)良好的客戶(hù)口碑。成都創(chuàng)新互聯(lián)公司提供從前期的網(wǎng)站品牌分析策劃、網(wǎng)站設(shè)計(jì)、成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、創(chuàng)意表現(xiàn)、網(wǎng)頁(yè)制作、系統(tǒng)開(kāi)發(fā)以及后續(xù)網(wǎng)站營(yíng)銷(xiāo)運(yùn)營(yíng)等一系列服務(wù),幫助企業(yè)打造創(chuàng)新的互聯(lián)網(wǎng)品牌經(jīng)營(yíng)模式與有效的網(wǎng)絡(luò)營(yíng)銷(xiāo)方法,創(chuàng)造更大的價(jià)值。
創(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】的訪(fǎng)問(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ò)程中,訪(fǎng)問(wèn)到用戶(hù)C的表,用戶(hù)B被授予訪(fǎng)問(wèn)用戶(hù)C的表的權(quán)限,但用戶(hù)A沒(méi)有被授予訪(fǎng)問(wèn)用戶(hù)C表的權(quán)限,那么用戶(hù)A調(diào)用用戶(hù)B的存儲(chǔ)過(guò)程是失敗的還是成功的呢?答案是成功的。
基本概念
存儲(chǔ)過(guò)程和存儲(chǔ)函數(shù)相當(dāng)于一個(gè)東西。
存儲(chǔ)過(guò)程在Oracle里叫procedure。
存儲(chǔ)過(guò)程沒(méi)有返回值。
存儲(chǔ)函數(shù)在Oracle里叫function。
存儲(chǔ)函數(shù)有返回值。
基本語(yǔ)法
create or replace procedure 名字
--create or replace 意思是創(chuàng)建或者替換
as
--可以在此定義參數(shù)
begin
語(yǔ)句;
end;
例:
create? or? replace ? procedure ? sayhello
as
--說(shuō)明 相當(dāng)與declare
begin
dbms_output.put_line('Hello World');
end;
基本調(diào)用
begin
-- Call the procedure
sayhello;
sayhello;
sayhello;
end;
帶參數(shù)的存儲(chǔ)過(guò)程--查詢(xún)某個(gè)員工的年收入
create or replace procedure upmoney(testname in test_procedure.name%type)?
as
begin?
update test_procedure t set t.money = t.money + 1000
where t.name = testname;?
end?
upmoney;
特別的地方,參數(shù)要指明是輸入?yún)?shù)還是輸出參數(shù)。
存儲(chǔ)函數(shù)
create or replace function Fupmoney(tname in varchar2) ?? return number
as ? ? --定義月薪參數(shù)
tmoney test_procedure.money%type;
begin
--得到月薪
select t.money
into tmoney
from test_procedure t
where t.name = tname;
dbms_output.put_line(tmoney*12);
return(tmoney*12);
end;
創(chuàng)建一個(gè)多輸出參數(shù)的存儲(chǔ)函數(shù)例子
create or replace procedure manyparm(tname in varchar2,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? tjob out varchar2,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? tmoney out number,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? tdept out varchar2)
is
begin
select t.job,t.money,t.dept
? into tjob,tmoney,tdept
? from test_procedure t
? where t.name = tname;
end manyparm;
給你示例你參考下:
----------------------------建立存儲(chǔ)過(guò)程:
CREATE OR REPLACE PROCEDURE P_name--存儲(chǔ)過(guò)程名字
(
i_var in int, --輸入?yún)?shù)1
o_var OUT varchar2 --輸出參數(shù)1
)
IS
v_STR VARCHAR2(200); --定義存儲(chǔ)過(guò)程內(nèi)部的局部變量
BEGIN
--下面是存儲(chǔ)過(guò)程的主體實(shí)現(xiàn)部分
v_STR := i_var;
dbms_output.put_line(v_STR);
o_var := v_STR;
exception--錯(cuò)誤異常處理部分
when others then
dbms_output.put_line(sqlerrm);--打印錯(cuò)誤信息
END P_name;
-----------------------------------調(diào)用存儲(chǔ)過(guò)程示例:
declare
v_in int;
v_out varchar2(50);
begin
v_in :=100;
P_name (v_in,v_out); --調(diào)用存儲(chǔ)過(guò)程P_name
dbms_output.put_line('存儲(chǔ)過(guò)程輸入結(jié)果為:'||v_out);
exception--錯(cuò)誤異常處理部分
when others then
dbms_output.put_line(sqlerrm);--打印錯(cuò)誤信息
end;