程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> Oracle存儲過程學習筆記

Oracle存儲過程學習筆記

編輯:Oracle教程

Oracle存儲過程學習筆記


存儲過程

存儲過程是一種命名pl/sql程序塊,它可以被賦予參數,存儲在數據庫中,可以被用戶調用.由於存儲過程是已編譯好的代碼,所以在調用的時候不必再次編譯代碼,從而提高程序的運行效率。另外存儲過程可以實現程序的模塊化設計.

1、創建存儲過程

語法:

 Create [or replace] procedure procedure_name  
 [ (parameter[{in|in out}]) data_type,  
 (parameter[{in|in out}]) data_type,  
 ……  
 ]  
{ is|as}  
 Decoration section  
Begin  
   Executable section;  
Exception  
   Exception handlers;  
End;  

Procedure_name存儲過程的名稱
Parameter 參數
In 向存儲過程傳遞參數
Out:從存儲過程返回參數
In out:傳遞和返回參數
Data_type:參數的類型 不能夠指明長度
As|is後聲明的變量主要過程體,且不能加declare語句

//創建一個插入emp中記錄的存儲過程 
SQL> create procedure insert_emp as  
     begin  
     insert into emp(empno,ename,job,mgr,sal,comm,deptno)  
values('7777','redarmy','teacher','7369',9000,1000,20);  
     commit;  
     end insert_emp;  
     / 

2、調用存儲過程

SQL> set serveroutput on;  
SQL> begin  
     insert_emp;  
     end;  
     /

3、修改存儲過程

SQL> create or replace procedure insert_emp as 
     //修改時只需加 or replace就可以了 裡邊的存儲過程就可以修改了  
     begin  
     insert into emp(empno,ename,job,mgr,sal,comm,deptno)  
values('7777','redarmy','teacher','7369',9000,1000,20);  
     commit;  
     end insert_emp;
     /  

4、參數

Oracle中有三種參數模型 in、out、in out

(1).in參數

該類型的參數值有調用者傳入,並且只能被存儲過程讀取,也是默認格式.

案例:

SQL> create or replace procedure insert_emp(  
     cempno in number,  
     cename in varchar2,  
     cjob in varchar2,  
     cmgr in number,  
     chiredate in date,  
     csal in number,  
     ccomm in number,  
     cdeptno in number  
     ) as  
     begin  
     insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno)  
      values(cempno,cename,cjob,cmgr,chiredate,csal,ccomm,cdeptno);  
     end insert_emp;  
     /

     Procedure created 

上面創建的存儲過程需要出入參數,在oralce有如下三種方式傳入參數

名稱表示法

語法如下:

參數名稱=>參數值;多個之間用逗號隔開

SQL> set serveroutput on;  
SQL> begin
insert_emp(cempno=>7377,cename=>'mjjj',cjob=>'stu',cmgr=>7777,chiredate=>to_date('2011-01-01','YYYY-MM-dd'),csal=>5000,ccomm=>1000,cdeptno=>20);  
  end;  
  /  
位置表示法

當參數比較多時,名稱表示法可能會比較長,為克服名稱表示法的弊端,可以采用位置表示法,注意參數一定要對應。

SQL> set serveroutput on;  
SQL> begin  
      insert_emp(3333,'mjjj','stu',7777,to_date('2011-01-01','YYYY-MM-dd'),5000,1000,20);  
  end;  
  /  
混合表示法
SQL> set serveroutput on;  
SQL> begin       insert_emp(9999,cename=>'mjjj',cjob=>'stu',cmgr=>7777,chiredate=>to_date('2011-01-01','YYYY-MM-dd'),csal=>5000,ccomm=>1000,cdeptno=>20);  
 end;  
 /

注意:當用戶使用的混合表示法時,分界線之前必須一致,分界線之後必須一致,並且不能穿插。

(2).out參數

該類型的參數值是有存儲過程寫入.out類型的參數適用於存儲過程向調用者返回多條信息的情況。

//創建一個根據員工編號查詢員工名稱及薪資存儲過程  
SQL> create or replace procedure emp_select(cempno in       number,cename out emp.ename%type,csal out emp.sal%type  
  ) is  
begin  
     select ename,sal into cename,csal from emp where     empno=cempno;  
     exception  
     when NO_DATA_FOUND then  
     cename:='NULL';  
     csal:=0;  
     end emp_select;  
     / 

Procedure created

調用存儲過程:

out輸出的參數是返回值,也就說在調用存儲過程的時候必須有提供能夠接受返回值的變量。
在這裡我們需要使用variable命令綁定參數

SQL> variable ename varchar2(20); //綁定參數的聲明  
SQL> variable sal number;  
SQL> begin  
     emp_select('7777',:ename,:sal); //執行存儲過程  
     end;  
     /  

PL/SQL procedure successfully completed  
ename  
---------  
redarmy  
sal  
---------  
9000  
SQL> print ename; //打印相應的參數  
ename  
---------  
redarmy  
SQL> print sal; //打印相應的參數  
sal  
---------  
9000  

(3).in out參數

in參數可以接收一個值,但是不能在存儲過程中修改這個值,而對於out參數,它在調用過程時為空,在過程執行中將為為這個參數指定一個值,並在執行後返回.
而in out參數同時具有了in參數和out參數的特性,在過程中可以讀取和寫入該類型的參數。

//作業實現 案例交換兩個數  
create or replace procedure test_pro(num1 in out number,num2 in out number) as
num3 number;
begin
dbms_output.put_line('調換前:'||num1||' '||num2);
num3:=num1;
num1:=num2;
num2:=num3;
dbms_output.put_line('調換後:'||num1||' '||num2);
end test_pro;   
//執行結果
SQL> set serveroutput on;
SQL> declare
    num1 number;
    num2 number;
    begin 
    num1:=1;
    num2:=2;
    test_pro(num1,num2);
    end;
    /

調換前:1 2
調換後:2 1

PL/SQL procedure successfully completed

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved