oracle
公司主營業務:成都網站設計、成都網站制作、移動網站開發等業務。幫助企業客戶真正實現互聯網宣傳,提高企業的競爭能力。成都創新互聯是一支青春激揚、勤奮敬業、活力青春激揚、勤奮敬業、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業文化,感謝他們對我們的高要求,感謝他們從不同領域給我們帶來的挑戰,讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。成都創新互聯推出海滄免費做網站回饋大家。
存儲過程的基本語法
1.基本結構
CREATE
OR
REPLACE
PROCEDURE
存儲過程名字
(
參數1
IN
NUMBER,
參數2
IN
NUMBER
)
IS
變量1
INTEGER
:=0;
變量2
DATE;
BEGIN
END
存儲過程名字
2.SELECT
INTO
STATEMENT
將select查詢的結果存入到變量中,可以同時將多個列存儲多個變量中,必須有一條
記錄,否則拋出異常(如果沒有記錄拋出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
循環
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.帶參數的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
連接數據庫后建立一個Test
WINDOW
在窗口輸入調用SP的代碼,F9開始debug,CTRL+N單步調試
一:存儲過程
創建存儲過程,需要有CREATE PROCEDURE或CREATE ANY PROCEDURE的系統權限? ?
刪除存儲過程,是過程的創建者或者擁有DROP ANY PROCEDURE系統權限?
修改存儲過程,則只能是過程的創建者或者擁有ALTER ANY PROCEDURE系統權限的人
執行(或調用)存儲過程,是過程的創建者或是擁有EXECUTE ANY PROCEDURE系統權限的人或是被擁有者授予EXECUTE權限的人
1:語法
1)創建
CREATE[ORREPLACE]PROCEDURE存儲過程名[(參數[IN|OUT|INOUT] 數據類型...)]
{AS|IS}
[說明部分]
BEGIN
可執行部分
[EXCEPTION
錯誤處理部分]
END[過程名];
說明:
OR REPLACE?表示如果存在就覆蓋存儲過程
參數有三種形式:IN、OUT和IN OUT。則默認為IN。
關鍵字AS也可以寫成IS,后跟過程的說明部分,可以在此定義過程的局部變量。
2)刪除存儲過程:
DROP PROCEDURE 存儲過程名;
3)修改存儲過程:
? ALTER PROCEDURE 存儲過程名 COMPILE;?
4)執行存儲過程
??EXECUTE 模式名.存儲過程名[(參數...)];?
?或
? ?BEGIN?
模式名.存儲過程名[(參數...)];
END;
另外:參數可以是變量、常量或表達式
要其它用戶執行存儲過程須要給其它用戶授權
GRANT EXECUTE ON 存儲過程名 TO 用戶名
2:參數說明
IN 定義一個輸入參數變量,用于傳遞參數給存儲過程
OUT 定義一個輸出參數變量,用于從存儲過程獲取數據
IN OUT 定義一個輸入、輸出參數變量,兼有以上兩者的功能
1)參數名 IN 數據類型 DEFAULT 值;
? ? ??定義一個輸入參數變量,用于傳遞參數給存儲過程。
? ? ??可以是常量、有值變量或表達式
? ? ??DEFAULT 關鍵字為可選項,用來設定參數的默認值。如果在調用存儲過程時不指明參數,則參數變量取默認值
? ? ??在存儲過程中,輸入變量接收主程序傳遞的值,但不能對其進行賦值。
2)參數名 OUT 數據類型;
? ? ??定義一個輸出參數變量,用于從存儲過程獲取數據,即變量從存儲過程中返回值給主程序。
? ? ? 在調用存儲過程時,主程序的實際參數只能是一個變量,而不能是常量或表達式。
? ? ??在存儲過程中,參數變量只能被賦值而不能將其用于賦值,而且必須給輸出變量至少賦值一次。
3)參數名 IN OUT 數據類型 DEFAULT 值;?
? ? ??定義一個輸入、輸出參數變量,兼有以上兩者的功能。
? ? ??在調用存儲過程時,主程序的實際參數只能是一個變量,而不能是常量或表達式。
? ? ??DEFAULT 關鍵字為可選項,用來設定參數的默認值。
? ? ??在存儲過程中,變量接收主程序傳遞的值,同時可以參加賦值運算,也可以對其進行賦值。在存儲過程中必須給變量至少賦值一次。
補充:如果省略IN、OUT或IN OUT,則默認模式是IN。?
? ? ? 調用它時參數個數與位置可以不一致,用以下形式調用:
EXECUTE CHANGE_SALARY(P_RAISE=80,P_EMPNO=7788); ?//=運算符左側是參數名,右側是參數表達式
二:函數
創建函數,需要有CREATE PROCEDURE或CREATE ANY PROCEDURE的系統權限
刪除函數,需要是函數的創建者或者是擁有DROP ANY PROCEDURE系統權限的人
修改函數,需要是函數的創建者或者擁有ALTER ANY PROCEDURE系統權限的人
執行函數,需要是函數的創建者或擁有EXECUTE ANY PROCEDURE系統權限的人
1:語法
1)創建:
CREATE[ORREPLACE]FUNCTION函數名[(參數[IN] 數據類型...)]
RETURN數據類型
{AS|IS}
[說明部分]
BEGIN
可執行部分
RETURN(表達式)
[EXCEPTION
錯誤處理部分]
END[函數名];
說明:
?參數是可選的,但只能是IN類型(IN關鍵字可以省略)。
?在定義部分的RETURN 數據類型,用來表示函數的數據類型,也就是返回值的類型,不可省略。
?在可執行部分的RETURN(表達式),用來生成函數的返回值,其表達式的類型應該和定義部分說明的函數返回值的數據類型一致。在函數的執行部分可以有多個RETURN語句,但只有一個RETURN語句會被執行,一旦執行了RETURN語句,則函數結束并返回調用環境。?
2)刪除
??DROP FUNCTION 函數名;
3)修改
??ALTER PROCEDURE 函數名 COMPILE;
4)執行
??變量名:=函數名(...)?
三:對存儲過程 和 函數的查看(可以通過對數據字典【USER_SOURCE】的訪問來查詢存儲過程或函數的有關信息)
1:查詢某個存儲過程序內容
select TEXT from user_source WHERE NAME='存儲過程名';
2:查看數據字殿
DESCRIBE USER_SOURCE ; //命令行中
3:查看存儲過程的參數
DESCRIBE say_hello; //后面是過程名
4:查看發生編輯錯誤
SHOW ERRORS ;
5:查詢一個存儲過程或函數是否是有效狀態(即編譯成功)
SELECT STATUS FROM USER_OBJECTS WHERE OBJECT_NAME='過程名';//注意大小寫
VALID表示該存儲過程有效(即通過編譯),INVALID表示存儲過程無效或需要重新編譯。它的狀態會改變,這與它依賴外部表(表刪除修改等操作)有關系
6:查看存儲過程與表的依賴關系
SELECT REFERENCED_NAME,REFERENCED_TYPE FROM USER_DEPENDENCIES WHERE NAME='SAY_HELLO';
說明
NAME為實體名,TYPE為實體類型,REFERENCED_OWNER為涉及到的實體擁有者賬戶,REFERENCED_NAME為涉及到的實體名,REFERENCED_TYPE 為涉及到的實體類型。
問題:
如果一個用戶A被授予執行屬于用戶B的一個存儲過程的權限,在用戶B的存儲過程中,訪問到用戶C的表,用戶B被授予訪問用戶C的表的權限,但用戶A沒有被授予訪問用戶C表的權限,那么用戶A調用用戶B的存儲過程是失敗的還是成功的呢?答案是成功的。
Oracle存儲過程基本語法:
CREATE?OR?REPLACE?PROCEDURE?存儲過程名?
IS?
BEGIN?
NULL;?
END;
解釋:
行1:?
CREATE OR REPLACE PROCEDURE 是一個SQL語句通知Oracle數據庫去創建一個叫做skeleton存儲過程, 如果存在就覆蓋它;?
行2:?
IS關鍵詞表明后面將跟隨一個PL/SQL體。?
行3:?
BEGIN關鍵詞表明PL/SQL體的開始。?
行4:?
NULL PL/SQL語句表明什么事都不做,這句不能刪去,因為PL/SQL體中至少需要有一句;?
行5:?
END關鍵詞表明PL/SQL體的結束。
sqlplus 中直接敲入存儲過程代碼(create or replace procedure ...), / 結束,\x0d\x0a如果代碼沒有錯誤,該過程就被保存到數據庫中。 \x0d\x0a可以用 exec 過程名 運行。\x0d\x0a\x0d\x0a如果是plsql developer之類的工具,那更簡單,編輯完存儲過程后,有運行按鈕,點擊即可。
你首先要了解存儲過程包括哪些模塊,哪些是必備的,哪些是可選的.\x0d\x0a另外呢,如果有條件的話,最好能找一些模板看看別人是怎么寫的,再結合你們公司的實際情況,做一些適當的調整.\x0d\x0a例如create or replace procedure +過程名字(變量名 in,數據類型,變量名 out 數據類型)等\x0d\x0adeclare\x0d\x0a變量 類型\x0d\x0abegin\x0d\x0a過程體\x0d\x0aexception\x0d\x0aend\x0d\x0a等\x0d\x0a最好有些實例,可以先模仿著寫一寫\x0d\x0a等熟練之后呢,再自己按照自己的思路去寫
當前名稱:oracle怎么保存過程,oracle怎么寫存儲過程
鏈接地址:http://m.kartarina.com/article2/heicoc.html
成都網站建設公司_創新互聯,為您提供服務器托管、網站導航、品牌網站設計、響應式網站、微信小程序、移動網站建設
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯