sql第18天 儲存過程和函式

2021-10-22 05:38:08 字數 3776 閱讀 3601

層次查詢

函式儲存過程是乙個有名字的plsql**塊

他沒有返回值但是有輸出引數,(可以將資料傳給外部程式)引數型別有三種: in,out,inout

儲存過程建立之後會儲存到資料庫中

當資料庫啟動時,自動的載入到記憶體中(一次建立,多次使用)

create[or

replace

]procedure 儲存過程名[

(引數名 in

|out

|inout 資料)]is

|asbegin

end;

in:輸入引數,只能讀不能修改,他是預設的引數型別,關鍵字可以省略,可以以任意三種方式傳參

out:輸出引數,作用:將程式的處理結果傳給外部程式,它只能以傳變數的方式傳參

inout:結合in和out引數,它也只能以傳變數的方式傳參。

create

orreplace

procedure p1

isbegin

for i in

1..9

loop

for j in

1..i loop

dbms_output.put(j||

'*'||i||

'='||

(i*j)

||' ');

if i*j <

10then

dbms_output.put(

' ')

endif

;end

loop

; dbms_output.new_line();

endloop

;end

舉例:寫乙個儲存過程,傳入兩個引數,乙個引數表示部門編號,乙個引數數字

1.在**塊中呼叫

declare

begin

儲存過程名(引數,);

end;

2.使用call命令呼叫

declare

begin

call 儲存過程名(引數)

;end

;

3.使用exec命令呼叫

declare

begin

exec 儲存過程名(引數);

--只能在sqlplus中使用

end;

不可以在儲存過程中修改in型別引數的值

舉例:寫乙個儲存過程,傳入兩個引數,乙個引數表示部門編號,乙個引數是輸出查詢到的部門的員工人數合計數

create

orreplace

procedure p3(dno number,n out number)

isbegin

select

count(1

)into n from emp where deptno=dno;

end;

呼叫:

declare

--宣告乙個變數儲存員工人數

c number;

begin

--呼叫儲存過程p3

p3(20,c)

dbms_output.put_line(c)

;end

;

舉例:結合in和out引數,只以傳變數的方式傳參

create

orreplace

procedure p4(n in

out number)

isbegin

select

count(1

)into n from emp where deptno=n;

end;

呼叫:

declare

--宣告乙個變數儲存員工人數

v number:=

&部門編號;

begin

--呼叫儲存過程

p4(v)

dbms_output.put_line(v)

;end

;

舉例:寫乙個儲存過程,傳入乙個部門編號,將部門下的員工資訊以游標返回

create

orreplace

procedure p5(dno number,v out sys_refcursor)

;--這裡為什麼用系統游標呢?

isbegin

open v for

select

*from emp where deptno=dno;

--開啟游標

end;

呼叫上述儲存過程p5

declare	

cur sys_refcursor;

v emp%rowtype;

begin

p5(10,cur)

;loop

fetch cur into v;

exit

when cur%notfound;

dbms_output.put_line(v.empno||

','||v.ename||

','||v.job||

','||v.mgr||

','||v.hiredate||

','||v.sal||

','||v.comm||

','||v.deptno)

;end

loop

;close cur;

end;

select 列名 from 表名 start

with 條件 connect

by prior 連線條件;

舉例:

將乙個表中全部的人的層級按照職位高低排序叫做層級查詢

層級查詢需要用到的 偽列叫做 level

函式也是乙個有名字的plsql**塊,他一般來完成乙個功能和計算過程。函式必須呼叫時使用返回值,引數分為輸入引數和輸入輸出引數,

1.函式中不允許使用臨時表

2.在一些情況下不能使用dml語句

3.函式可以在**塊中呼叫,也可以在sql語句中使用

create[or

replace

]function 函式名[

(引數 in

|out|in

out 資料型別,..

.)]return 返回值型別

isbegin

return語句

end;

舉例:寫乙個函式,計算乙個數的階乘,並返回階乘結果

create

orreplace

function fn1(n number)

return

18 儲存過程 SQL

好文要頂 一 建立 使用儲存過程 oracle版本 create procedure mailinglistcount listcount out integer is v rows integer begin select count into v rows from customers wher...

sql 儲存過程 函式

1 建立儲存過程 1 語法 create or replace procedure procedure name argument type 型別 變數的說明 begin 執行部分 exception 可選的異常錯誤處理程式 end 建立過程 sql create or replace proced...

sql儲存過程和函式的區別

1.自定義函式必須有返回值,標量值或者錶值。儲存過程可以沒有返回值 儲存過程是通過引數返回的,可以有多個或者沒有 2.對於儲存過程來說可以返回引數,如記錄集,而函式只能返回值或者表物件。函式只能返回乙個變數 而儲存過程可以返回多個。儲存過程的引數可以有in,out,inout三種型別,而函式只能有i...