oracle存儲過程
簡介
存儲過程,它是一個有名字的plsql代碼塊
創建之后會保存到數據庫中
當數據庫啟動時,會自動加載到數據庫內存中,執行效率高
存儲過程有參數,沒有返回值,但是有輸出參數
創建
存儲過程的創建語法
create [or replace] procedure 存儲過程名
[(形參 [in|out|in out] 數據類型,...)]
is|as
聲明部分
begin
plsql代碼塊
exception
異常處理部分
end;
創建一個存儲過程,打印10部門員工信息
create or replace procedure p
is
begin
for v in (select * from emp where deptno=10) loop
dbms_output.put_line(v.empno||' , '||v.ename||' , '||v.job||' , '||v.deptno);
end loop;
end;
調用
1在plsql代碼塊中調用
語法
存儲過程名[(實參)];
begin
p();
end;
輸出
9123 , june , , 10
7782 , CLARK , MANAGER , 10
7839 , KING , PRESIDENT , 10
7934 , MILLER , CLERK , 10
2使用call命令調用(sql命令)
語法
call 存儲過程名(實參)
call p();
輸出
9123 , june , , 10
7782 , CLARK , MANAGER , 10
7839 , KING , PRESIDENT , 10
7934 , MILLER , CLERK , 10
3使用exec命令調用(sqlplus命令)
語法
exec 存儲過程名(實參)
SQL> set serveroutput on
SQL> exec p();
9123 , june , , 10
7782 , CLARK , MANAGER , 10
7839 , KING , PRESIDENT , 10
7934 , MILLER , CLERK , 10
PL/SQL 過程已成功完成。
傳參
存儲過程的參數
- 輸入參數(in)
- 輸出參數(out)
- 輸入輸出參數(in out)
傳值方式
- 1傳值
- 2傳變量
- 3形參=>值
1,in參數
in參數:表示輸入參數,可以使用任意一種傳參方式
in參數實參的值只能被使用,不能被修改
注意,通過in參數傳的值,不能在程序中修改eno變量中的值
創建一個存儲過程,傳入員工編號,打印員工信息
create or replace procedure p1(eno in emp.empno%type)
is
--聲明一個變量,保存員工信息
v emp%rowtype;
begin
--根據員工編號查詢員工信息
select * into v from emp where empno=eno;
--打印員工信息
dbms_output.put_line(v.empno||' , '||v.ename||' , '||v.job||' , '||v.deptno);
exception
when no_data_found then
dbms_output.put_line('員工不存在');
end;
調用
傳值的方式調用p1
begin
p1(7369);
end;
輸出
7369 , SMITH , CLERK , 20
傳變量的方式調用
declare
empno number(4):=7499;
begin
p1(empno);
end;
輸出
7499 , ALLEN , SALESMAN , 30
形參=>值的方式調用
begin
p1(eno=>7521);
end;
輸出
7521 , WARD , SALESMAN , 30
2,out參數
out參數: 輸出參數,它只能以傳變量的方式傳值,
out參數的值是可以修改的
將存儲過程的運行結果放到變量中,通過變量將結果傳給外部程序
創建一個存儲過程
輸入一個員工編號,查詢員工信息,並將查詢結果傳給調用程序
create or replace procedure p2(eno in emp.empno%type,
v out emp%rowtype)
is
begin
select * into v from emp where empno=eno;
exception
when no_data_found then
dbms_output.put_line('員工不存在');
end;
調用
declare
v1 emp%rowtype;
begin
p2(7369,v1);
dbms_output.put_line(v1.empno||' , '||v1.ename||' , '||v1.job||' , '||v1.deptno);
end;
輸出
7369 , SMITH , CLERK , 20
創建一個存儲過程計算一個數字的階乘
create or replace procedure p3(n in number,res out number)
is
begin
--將res初始值設置為1
res:=1;
for i in 1..n loop
res:=res*i;
end loop;
end;
調用
declare
n number(10);
begin
p3(6,n);
dbms_output.put_line(n);
end;
輸出
720
3,in out參數
in out參數:輸入輸出參數,它擁有in和out的所有特性
必須以傳變量的方式傳參,傳入參數的初始值是有意義的,值是可以修改的
創建一個存儲過程,傳入員工編號,查詢員工信息,傳給外部程序
create or replace procedure p4(v in out emp%rowtype)
is
begin
select * into v from emp where empno=v.empno;
end;
調用
declare
v1 emp%rowtype;
begin
v1.empno:=7369;
p4(v1);
dbms_output.put_line(v1.empno||' , '||v1.ename||' , '||v1.job||' , '||v1.deptno);
end;
輸出
7369 , SMITH , CLERK , 20