oracle存儲過程


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM