ORACLE的儲存過程和函式

2021-08-22 11:44:35 字數 3064 閱讀 9489

儲存過程/儲存函式:指儲存在資料庫中供所有使用者程式呼叫的子程式

儲存過程和儲存函式的相同點:完成特定功能的程式

儲存過程和儲存函式的區別:是否用return語句返回值

儲存函式用return語句返回值,而儲存過程不能

建立和使用儲存過程

用create procedure 命令建立儲存過程和儲存函式

語法:

create [ or replace ] procedure 過程名(引數列表)

as plsql 子程式體;

儲存過程只能建立或替換,如果修改要使用replace

呼叫儲存過程:

1.exec sayhelloworld();

2.begin

sayhelloworld();

commit;

end;

練習:列印hello world

create or replace procedure sayhelloworld

as --說明部分

begin

dbms_output.put_line("hello world");

end;

練習:建立乙個帶引數的儲存過程

給指定的員工漲100塊錢的工資,並且列印漲前和漲後的薪水

create or replace procedure raisesalary(eno in number)

--in為輸入引數,out為輸出引數

as --定義乙個變數儲存漲前的薪水

psal emp.sal%type;

begin

--得到員工漲前的薪水

--into 將sal的值賦予psal

select sal into psal from emp where empno = eno;

--給該員工漲100

--注意:一般不在儲存過程或者儲存函式中,commit和rollback,

誰呼叫誰commit和rollback

update emp set sal = sal+100 where empno = eno;

--列印

dbms_output.put_line("漲前:"||psal||"漲後:"(psal+100));

end;

儲存函式

函式(function)為一命名的儲存程式,可帶引數,並返回一計算值。

函式和過程的結構類似,但必須有乙個return子句,用於返回函式值。

建立儲存函式

語法:

create [ or replace ] function 函式名(引數列表)

return 函式值型別

as plsql子程式體;

練習:查詢某個員工的年收入

create or replace function queryempincome(eno in number)

return number

as –定義變數儲存員工的薪水和獎金

psal emp.sal%type;

pcomm emp.comm%type;

begin

–得到該員工的月薪和獎金

select sal,comm into psal,pcomm from emp where empno=eno;

–直接返回年收入

return psal*12+nvl(pcomm,0);

end;

in和out引數

一般來講,儲存過程和儲存函式的區別在於儲存函式可以有乙個返回值;而儲存過程沒有返回值。

過程和函式都可以通過out指定乙個或多個輸出引數,實現返回多個值。

什麼時候用儲存過程/儲存函式?

原則:如果只有乙個返回值,用儲存函式;否則,就用儲存過程。

練習:out引數:查詢某個員工姓名、月薪、職位

create or replace procedure queryempinfo(eno in number,

pename out varchar2,

psal out number,

pjob out varchar2)

as begin

–得到該員工的姓名、月薪、職位

select ename,sal,empjob into pename,psal,pjob from emp where empno=eno;

end;

思考:1. out引數太多 2.out中返回集合

在應用程式中訪問儲存過程和儲存函式

呼叫儲存過程:

呼叫儲存函式:

eg:string sql = 「」;

string sql = 「」;

在out引數中使用游標

申明包結構:包頭、包體。包頭負責宣告,包體負責實現。

案例:查詢某個部門中所有員工的所有資訊

包頭:

create or replace package mypackage as

type empcursor is ref cursor;–宣告乙個游標型別empcursor

procedure queryemplist(dno in number,emplist out empcursor);

end mypackage;

包體:   包體需要實現包頭中宣告的所有方法

create or replace package body mypackage as

procedure queryemplist(dno in number,emplist out empcursor)

as begin

--游標使用前需要開啟游標

open emplist for select * from emp where deptno = dno;

end queryemplist;

end mypackage;

在應用程式中訪問包中的儲存過程

注意:需要帶上包名

呼叫儲存過程:

eg:string sql = 「」;

Oracle儲存過程和儲存函式

參看 oracle儲存過程 儲存函式 說明 儲存過程 儲存函式都是物件。包括表 檢視 索引 序列 同義詞等也是物件。概念 指儲存在資料庫中供所有使用者程式呼叫的子程式叫儲存 過程 儲存函式。特點 完成特定功能的程式。區別 儲存函式可以通過return子句返回乙個值。建立和使用儲存過程 用create...

oracle儲存過程和儲存函式(1)

第乙個儲存過程 create orreplace procedure sayhelloworld asbegin dbms output.put line hello world end 呼叫儲存過程 1.execute exec 2.在儲存過程中呼叫 begin sayhelloworld end...

oracle儲存過程和函式的區別

區別如下 案例 儲存過程 create or replace procedure prc aaa v a number v b out number isbegin v b 33 v a dbms output.put line v b end prc aaa 解析 v b 是返回引數,v a 是傳...