首頁 >資料庫 >Oracle >oracle資料庫的預存程序是什麼?

oracle資料庫的預存程序是什麼?

青灯夜游
青灯夜游原創
2020-08-22 15:19:545164瀏覽

oracle資料庫的預存程序:一組為了完成特定功能的SQL語句集,經過編譯後儲存在資料庫中。預存程序是由流控制和SQL語句書寫的過程,這個過程經過編譯和最佳化後儲存在資料庫伺服器中,應用程式使用時只要呼叫即可。

oracle資料庫的預存程序是什麼?

預存程序(Stored Procedure )是一組為了完成特定功能的SQL 語句集,經過編譯後儲存在資料庫中。使用者透過指定預存程序的名字並給出參數(如果該預存程序帶有參數)來執行它。預存程序是資料庫中的重要對象,任何一個設計良好的資料庫應用程式都應該用到預存程序。 

預存程序是由流控制和SQL 語句書寫的過程,這個過程經過編譯和最佳化後儲存在資料庫伺服器中,應用程式使用時只要呼叫即可。在ORACLE 中,若干個有連結的過程可以組合在一起構成一個程式包。

優點:

1、預存程序只在創造時進行編譯,以後每次執行預存程序都不需再重新編譯,而一般SQL語句每執行一次就編譯一次,所以使用預存程序可提高資料庫執行速度。

2、當資料庫複雜運算時(如對多個資料表進行Update、Insert、Query、Delete時),可將此複雜運算以預存程序封裝起來與資料庫提供的交易處理結合一起使用。

3、預存程序可以重複使用,可減少資料庫開發人員的工作量。

4、安全性高,可設定只有某使用者才具有指定預存程序的使用權。

 簡單說,你在你的機器上寫了個存儲過程,這個存儲過程像那些表裡的數據一樣被放在遙遠的數據庫伺服器當中,但是它又是可執行的代碼,其他能連到資料庫伺服器的用戶,可以呼叫你寫的預存程序

 它的作用是隱藏細節,就是說,你寫的預存程序程式碼可能很複雜,但其他人呼叫它卻很簡單,不用具體知道它是如何做的,且一次能完成多個指令 

基本語法

CREATE [OR REPLACE] PROCEDURE 存储过程名[(参数[IN|OUT|IN OUT] 数据类型...)] 
{AS|IS} 
[说明部分] 
BEGIN 
可执行部分 
[EXCEPTION 
错误处理部分] 
END [过程名];

1、可選關鍵字OR REPLACE 表示如果預存程序已經存在,則用新的預存程序覆蓋,通常用戶預存程序的重建。

2、參數部分用來定義多個參數(如果沒有參數,就可以省略)。參數有三種形式:IN、OUT和IN OUT。如果沒有指明參數的形式,則預設為IN。

3、關鍵字AS也可以寫成IS,後面接著過程的說明部分,可以在此定義過程的局部變數。

4、寫預存程序可以使用任何文字編輯器或直接在SQLPLus環境下進行,寫好的預存程序必須在SQLPLus環境下編譯,產生編譯程式碼,原程式碼和編譯程式碼在編譯過程中都會存入資料庫。編譯成功的預存程序就可以在ORacle環境下進行呼叫了。

5、一個預存程序在不需要時可以刪除。刪除儲存過程的人是過程的創建者或擁有DROP ANY PROCEDURE系統權限的人。刪除預存程序的語法如下:

DROP PROCEDURE 存储过程名;

6、如果要重新編譯一個預存程序,則只能是過程的創建者或擁有ALTER ANY PROCEDURE系統權限的人。語法如下:

ALTER PROCEDURE 存储过程名 COMPILE;

7、執行(或呼叫)預存程序的人是過程的創建者或是擁有EXECUTE ANY PROCEDURE系統權限的人,或是被擁有者授予EXECUTE 權限的人。執行的方法如下:

方法1: 

EXECUTE 模式名.存储过程名[(参数...)];

方法2: 

BEGIN 
模式名.存储过程名[(参数...)]; 
END;

8、傳遞的參數必須與定義的參數類型、個數和順序一致(如果參數定義了預設值,則呼叫時可以省略參數)。參數可以是變數、常數或表達式。

9、as和is的區別:在預存程序(procedure)和函數(function)中兩者都可以使用,但是使用IS將無法使用調試模式調試該存儲函數;在視圖中只能用AS不能用IS,在遊標(CURSOR)中只能用IS不能用AS。

10、oracle中的decode函數

意義解釋:

decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值)

該函數的意義如下:

IF 条件=值1 THEN
    RETURN(翻译值1)
ELSIF 条件=值2 THEN
    RETURN(翻译值2)
    ......
ELSIF 条件=值n THEN
    RETURN(翻译值n)
ELSE
    RETURN(缺省值)
END IF
decode(字段或字段的运算,值1,值2,值3)

這個函數運行的結果是,當當欄位或欄位的運算的值等於值1時,函數傳回值2,否則傳回值3

 當然值1,值2,值3也可以是表達式,這個函數使得某些sql語句簡單了許多

範例:

select decode(sign(变量1-变量2),-1,变量1,变量2) from dual; --取较小值

sign()函數根據某個值是0、正數還是負數,分別傳回0、1、-1

例如:

變數1=10,變數2=20

則sign(變數1-變數2)回傳-1,decode解碼結果為“變數1”,達到了取較小值的目的。

11、nvl函數

NVL函數的格式如下:NVL(expr1,expr2)

意思是:如果oracle第一個參數為空那麼顯示第二個參數的值,如果第一個參數的值不為空,則顯示第一個參數本來的值。

NVL2函数的格式如下:NVL2(expr1,expr2, expr3)

含义是:如果该函数的第一个参数为空那么显示第二个参数的值,如果第一个参数的值不为空,则显示第三个参数的值。

NULLIF(exp1,expr2)函数的作用是如果exp1和exp2相等则返回空(NULL),否则返回第一个值。

Coalese函数的作用是的NVL的函数有点相似,其优势是有更多的选项。

格式如下:

Coalesce(expr1, expr2, expr3….. exprn)

表示可以指定多个表达式的占位符。所有表达式必须是相同类型,或者可以隐性转换为相同的类型。

返回表达式中第一个非空表达式,如有以下语句:   

SELECT COALESCE(NULL,NULL,3,4,5) FROM dual

其返回结果为:3

如果所有自变量均为 NULL,则 COALESCE 返回 NULL 值

12、max函数

对字符型数据的最大值,是按照首字母由A~Z的顺序排列,越往后,其值越大。当然,对于汉字则是按照其全拼拼音排列的,若首字符相同,则比较下一个字符,以此类推。

13、随机抽取N条记录

https://blog.csdn.net/bbliutao/article/details/7727322

14、untion all

union all,解释为联合所有。

Union解释为联合。union或者Union all实现把前后两个select集合的数据联合起来,组成一个结果集查询输出。这就要求联合前后的结果集,需要分别有相同的输出字段的数目,并且对应的字段类型要相同。
SELECT column1, column2 from table1 union (all) select column1, column2 from table2

以上语句要求量表的column1字段类型相同,column2类型相同。而且每个查询的数目都是一样的。UNION ALL和UNION的差别就在ALL上面,第一个叫联合所有,说明会显示前后两个查询所有的数据,而UNION没有ALL(所有)这个单词,实现将前后两个查询的数据联合到一起后,去掉重复的数据显示

推荐教程:《Oracle教程

以上是oracle資料庫的預存程序是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn