Oracle 資料庫中函式和儲存過程有啥區別

2021-08-20 00:23:43 字數 3480 閱讀 4085

(1)函式必須有返回值,儲存過程可以沒有返回值

(2)函式可以單獨執行,儲存過程必須通過execute執行

(3)函式可以嵌入sql中執行,而儲存過程不行

我們可以把比較複雜的查詢寫成函式,然後在儲存過程中呼叫這些函式

引用竹瀝半夏

:一、儲存過程

1.定義

儲存過程是儲存在資料庫中提供所有使用者程式呼叫的子程式,定義儲存過程的關鍵字為procedure。

2.建立儲存過程

create [or replace] procedure 儲存過程名

[(引數1 型別,引數2 out 型別……)]                                       

as變數名  型別;

begin

程式**體

end;

示例一:無參無返

create

orreplace

procedure

p1--

or replace代表建立該儲存過程時,若儲存名存在,則替換原儲存過程,重新建立

--無引數列表時,不需要寫()

asbegin

dbms_output.put_line(

'hello world');

end;

--執行儲存過程方式1

set serveroutput on

;begin

p1();

end;

--執行儲存過程方式2

set serveroutput on

;execute p1();

示例二:有參有返

create

orreplace

procedure

p2(name

invarchar2,age int,msg out varchar2)--

引數列表中,宣告變數型別時切記不能寫大小,只寫型別名即可,例如引數列表中的name變數的宣告

--引數列表中,輸入引數用in表示,輸出引數用out表示,不寫時預設為輸入引數。

------------輸入引數不能攜帶值出去,輸出引數不能攜帶值進來,當既想攜帶值進來,又想攜帶值出去,可以用in out

asbegin

msg:='

姓名'||name||

',年齡'||

age;

--賦值時除了可以使用:=,還可以用into來實現

--上面子句等價於select '姓名'||name||',年齡'||age into msg from dual;

end;

--執行儲存過程

set serveroutput on

;declare

msg

varchar2(100);

begin

p2('

張三',23,msg);

dbms_output.put_line(msg);

end;

示例三:引數列表中有in out引數

create

orreplace

procedure

p3(msg

in out varchar2)--

當既想攜帶值進來,又想攜帶值出去,可以用in out

asbegin

dbms_output.put_line(msg);

--輸出的為攜帶進來的值

msg:=

'我是從儲存過程中攜帶出來的值';

end;

--執行儲存過程

set serveroutput on

;declare

msg

varchar2(100):=

'我是從攜帶進去的值';

begin

p3(msg);

dbms_output.put_line(msg);

end;

示例四:儲存過程中定義引數

create

orreplace

procedure

p4as

--儲存過程中定義的引數列表

name varchar(50);

begin

name :='

hello world';

dbms_output.put_line(name);

end;

---執行儲存過程

set serveroutput on

;execute p4();

總結:1.建立儲存過程的關鍵字為procedure。

2.傳參列表中的引數可以用in,out,in out修飾,引數型別一定不能寫大小。列表中可以有多個輸入輸出引數。

3.儲存過程中定義的引數列表不需要用declare宣告,宣告引數型別時需要寫大小的一定要帶上大小。

4.as可以用is替換。

5.呼叫帶輸出引數的過程必須要宣告變數來接收輸出引數值。

6.執行儲存過程有兩種方式,一種是使用execute,另一種是用begin和end包住。

儲存過程雖然有很多優點,但是它卻不能使用return返回值。當需要使用return返回值時,我們可以使用函式。

二、儲存函式

1.函式與儲存過程的結構類似,但是函式必須有乙個return子句,用於返回函式值。

create

orreplace

function

f1return

varchar

--必須有返回值,且宣告返回值型別時不需要加大小

asmsg

varchar(50);

begin

msg :='

hello world';

return

msg;

end;

--執行函式方式1

select f1() from

dual;

--執行函式方式2

set serveroutput on

;begin

dbms_output.put_line(f1());

end;

三、儲存過程與儲存函式的區別和聯絡

相同點:1.建立語法結構相似,都可以攜帶多個傳入引數和傳出引數。

2.都是一次編譯,多次執行。

不同點:1.儲存過程定義關鍵字用procedure,函式定義用function。

2.儲存過程中不能用return返回值,但函式中可以,而且函式中必須有return子句。

3.執行方式略有不同,儲存過程的執行方式有兩種(1.使用execute2.使用begin和end),函式除了儲存過程的兩種方式外,還可以當做表示式使用,例如放在select中(select f1() form dual;)。

總結:如果只有乙個返回值,用儲存函式,否則,一般用儲存過程。

Oracle資料庫儲存過程和儲存函式

指儲存在資料庫中供所有使用者程式呼叫的子程式叫儲存過程 儲存函式。儲存過程沒有返回值。儲存函式有返回值 建立儲存過程 用create procedure命令建立儲存過程和儲存函式。語法 create or replace procedure過程名 引數列表 as plsql子程式體 儲存過程示例 為...

oracle資料庫 儲存函式

一組封裝好的sql 語句集,提前編譯好,儲存在服務端。1 返回值 儲存函式必須有且只有乙個返回值,而儲存過程沒有return返回值。2 語法不同 儲存函式可以用在select語句中。儲存函式中一般不寫輸出引數。儲存函式可以與儲存過程互換,儲存函式可以在儲存過程中呼叫。1 基本語法結構 create ...

Oracle資料庫儲存過程和函式的區別

儲存過程 函式 作為pl sql 語句執行 作為表示式的一部分呼叫 在規範中不包含return 子句 必須在規範中包含return 子句 不返回任何值 必須返回單個值 可以包含return 語句,但是與函式不同,它不能用於返回值 必須包含至少一條return 語句 儲存過程使我們可以在sql命令中直...