你可以先建一aaa.TXT文件,保存SQL語句后,在SQL PLUS或是可以執(zhí)行SQL語句的地方這樣寫 !c:\aaa.txt; 嘆號是執(zhí)行的命令,一定要記得寫。
成都創(chuàng)新互聯(lián)擁有一支富有激情的企業(yè)網(wǎng)站制作團隊,在互聯(lián)網(wǎng)網(wǎng)站建設(shè)行業(yè)深耕十多年,專業(yè)且經(jīng)驗豐富。十多年網(wǎng)站優(yōu)化營銷經(jīng)驗,我們已為上千家中小企業(yè)提供了成都做網(wǎng)站、網(wǎng)站制作解決方案,按需定制開發(fā),設(shè)計滿意,售后服務(wù)無憂。所有客戶皆提供一年免費網(wǎng)站維護!
SQLspool oracle.log
SQL select * from dual;
SQLspool off
然后檢查下oracle.log文件
ctrl+s 會提示保存路徑。
一:存儲過程
創(chuàng)建存儲過程,需要有CREATE PROCEDURE或CREATE ANY PROCEDURE的系統(tǒng)權(quán)限? ?
刪除存儲過程,是過程的創(chuàng)建者或者擁有DROP ANY PROCEDURE系統(tǒng)權(quán)限?
修改存儲過程,則只能是過程的創(chuàng)建者或者擁有ALTER ANY PROCEDURE系統(tǒng)權(quán)限的人
執(zhí)行(或調(diào)用)存儲過程,是過程的創(chuàng)建者或是擁有EXECUTE ANY PROCEDURE系統(tǒng)權(quán)限的人或是被擁有者授予EXECUTE權(quán)限的人
1:語法
1)創(chuàng)建
CREATE[ORREPLACE]PROCEDURE存儲過程名[(參數(shù)[IN|OUT|INOUT] 數(shù)據(jù)類型...)]
{AS|IS}
[說明部分]
BEGIN
可執(zhí)行部分
[EXCEPTION
錯誤處理部分]
END[過程名];
說明:
OR REPLACE?表示如果存在就覆蓋存儲過程
參數(shù)有三種形式:IN、OUT和IN OUT。則默認為IN。
關(guān)鍵字AS也可以寫成IS,后跟過程的說明部分,可以在此定義過程的局部變量。
2)刪除存儲過程:
DROP PROCEDURE 存儲過程名;
3)修改存儲過程:
? ALTER PROCEDURE 存儲過程名 COMPILE;?
4)執(zhí)行存儲過程
??EXECUTE 模式名.存儲過程名[(參數(shù)...)];?
?或
? ?BEGIN?
模式名.存儲過程名[(參數(shù)...)];
END;
另外:參數(shù)可以是變量、常量或表達式
要其它用戶執(zhí)行存儲過程須要給其它用戶授權(quán)
GRANT EXECUTE ON 存儲過程名 TO 用戶名
2:參數(shù)說明
IN 定義一個輸入?yún)?shù)變量,用于傳遞參數(shù)給存儲過程
OUT 定義一個輸出參數(shù)變量,用于從存儲過程獲取數(shù)據(jù)
IN OUT 定義一個輸入、輸出參數(shù)變量,兼有以上兩者的功能
1)參數(shù)名 IN 數(shù)據(jù)類型 DEFAULT 值;
? ? ??定義一個輸入?yún)?shù)變量,用于傳遞參數(shù)給存儲過程。
? ? ??可以是常量、有值變量或表達式
? ? ??DEFAULT 關(guān)鍵字為可選項,用來設(shè)定參數(shù)的默認值。如果在調(diào)用存儲過程時不指明參數(shù),則參數(shù)變量取默認值
? ? ??在存儲過程中,輸入變量接收主程序傳遞的值,但不能對其進行賦值。
2)參數(shù)名 OUT 數(shù)據(jù)類型;
? ? ??定義一個輸出參數(shù)變量,用于從存儲過程獲取數(shù)據(jù),即變量從存儲過程中返回值給主程序。
? ? ? 在調(diào)用存儲過程時,主程序的實際參數(shù)只能是一個變量,而不能是常量或表達式。
? ? ??在存儲過程中,參數(shù)變量只能被賦值而不能將其用于賦值,而且必須給輸出變量至少賦值一次。
3)參數(shù)名 IN OUT 數(shù)據(jù)類型 DEFAULT 值;?
? ? ??定義一個輸入、輸出參數(shù)變量,兼有以上兩者的功能。
? ? ??在調(diào)用存儲過程時,主程序的實際參數(shù)只能是一個變量,而不能是常量或表達式。
? ? ??DEFAULT 關(guān)鍵字為可選項,用來設(shè)定參數(shù)的默認值。
? ? ??在存儲過程中,變量接收主程序傳遞的值,同時可以參加賦值運算,也可以對其進行賦值。在存儲過程中必須給變量至少賦值一次。
補充:如果省略IN、OUT或IN OUT,則默認模式是IN。?
? ? ? 調(diào)用它時參數(shù)個數(shù)與位置可以不一致,用以下形式調(diào)用:
EXECUTE CHANGE_SALARY(P_RAISE=80,P_EMPNO=7788); ?//=運算符左側(cè)是參數(shù)名,右側(cè)是參數(shù)表達式
二:函數(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:語法
1)創(chuàng)建:
CREATE[ORREPLACE]FUNCTION函數(shù)名[(參數(shù)[IN] 數(shù)據(jù)類型...)]
RETURN數(shù)據(jù)類型
{AS|IS}
[說明部分]
BEGIN
可執(zhí)行部分
RETURN(表達式)
[EXCEPTION
錯誤處理部分]
END[函數(shù)名];
說明:
?參數(shù)是可選的,但只能是IN類型(IN關(guān)鍵字可以省略)。
?在定義部分的RETURN 數(shù)據(jù)類型,用來表示函數(shù)的數(shù)據(jù)類型,也就是返回值的類型,不可省略。
?在可執(zhí)行部分的RETURN(表達式),用來生成函數(shù)的返回值,其表達式的類型應(yīng)該和定義部分說明的函數(shù)返回值的數(shù)據(jù)類型一致。在函數(shù)的執(zhí)行部分可以有多個RETURN語句,但只有一個RETURN語句會被執(zhí)行,一旦執(zhí)行了RETURN語句,則函數(shù)結(jié)束并返回調(diào)用環(huán)境。?
2)刪除
??DROP FUNCTION 函數(shù)名;
3)修改
??ALTER PROCEDURE 函數(shù)名 COMPILE;
4)執(zhí)行
??變量名:=函數(shù)名(...)?
三:對存儲過程 和 函數(shù)的查看(可以通過對數(shù)據(jù)字典【USER_SOURCE】的訪問來查詢存儲過程或函數(shù)的有關(guān)信息)
1:查詢某個存儲過程序內(nèi)容
select TEXT from user_source WHERE NAME='存儲過程名';
2:查看數(shù)據(jù)字殿
DESCRIBE USER_SOURCE ; //命令行中
3:查看存儲過程的參數(shù)
DESCRIBE say_hello; //后面是過程名
4:查看發(fā)生編輯錯誤
SHOW ERRORS ;
5:查詢一個存儲過程或函數(shù)是否是有效狀態(tài)(即編譯成功)
SELECT STATUS FROM USER_OBJECTS WHERE OBJECT_NAME='過程名';//注意大小寫
VALID表示該存儲過程有效(即通過編譯),INVALID表示存儲過程無效或需要重新編譯。它的狀態(tài)會改變,這與它依賴外部表(表刪除修改等操作)有關(guān)系
6:查看存儲過程與表的依賴關(guān)系
SELECT REFERENCED_NAME,REFERENCED_TYPE FROM USER_DEPENDENCIES WHERE NAME='SAY_HELLO';
說明
NAME為實體名,TYPE為實體類型,REFERENCED_OWNER為涉及到的實體擁有者賬戶,REFERENCED_NAME為涉及到的實體名,REFERENCED_TYPE 為涉及到的實體類型。
問題:
如果一個用戶A被授予執(zhí)行屬于用戶B的一個存儲過程的權(quán)限,在用戶B的存儲過程中,訪問到用戶C的表,用戶B被授予訪問用戶C的表的權(quán)限,但用戶A沒有被授予訪問用戶C表的權(quán)限,那么用戶A調(diào)用用戶B的存儲過程是失敗的還是成功的呢?答案是成功的。
具體如下:
1、第一步,創(chuàng)建一個新的存儲過程,見下圖,轉(zhuǎn)到下面的步驟。
2、第二步,完成上述步驟后,修改存儲過程。
此存儲過程具有一個輸入?yún)?shù)(pid)和一個輸出參數(shù),即通過用戶id查詢用戶名并返回名稱,見下圖,轉(zhuǎn)到下面的步驟。
3、第三步,完成上述步驟后,調(diào)試存儲過程,找到新創(chuàng)建的存儲過程,右鍵單擊[test]按鈕,見下圖,轉(zhuǎn)到下面的步驟。
4、第四步,完成上述步驟后,修改id值,然后單擊左上角的“倒三角”按鈕以開始調(diào)試,見下圖,轉(zhuǎn)到下面的步驟。
5、第五步,完成上述步驟后,按[CTRL +
N]進行單步調(diào)試,按[CTRL + O]單步調(diào)試,按[CTRL + T]退出調(diào)試,或者單擊調(diào)試工具進行調(diào)試,見下圖,轉(zhuǎn)到下面的步驟。
6、第六步,完成上述步驟后,可以在窗口底部輸入變量名稱,以觀察變量的變化,見下圖,轉(zhuǎn)到下面的步驟。
7、第七步,完成上述步驟后,可以查看調(diào)試結(jié)果,見下圖。這樣,就解決了這個問題了。
sqlplus 中直接敲入存儲過程代碼(create or replace procedure ...), / 結(jié)束,
如果代碼沒有錯誤,該過程就被保存到數(shù)據(jù)庫中。
可以用 exec 過程名 運行。
如果是plsql developer之類的工具,那更簡單,編輯完存儲過程后,有運行按鈕,點擊即可。
create or replace procedure Insert10000Data (low in int) as
begin
for i in 1..low loop
insert into ROOM(roomno,price)
values(sql_room.nextval, round(1000*DBMS_RANDOM.VALUE));
end loop;
commit;
end;
調(diào)用:
begin
Insert10000Data(10000);
end;