Oracle 基礎 ----procedure(儲存過程)

tieshuai發表於2008-03-01

  Oracle 基礎 ----procedure(儲存過程)

 

 

儲存過程是一種命名pl/sql程式塊,它可以被賦予引數,儲存在資料庫中,可以被使用者呼叫,由於儲存過程是已經編譯好的程式碼,所以在呼叫的時候不必再進行編譯,從而提高程式的執行效率。

同時,使用儲存過程可以實現程式的模組化設計。

 

例子:

 Create procedure insertmer as

Begin

   Inser into mar values(‘’);

Exception

  When dup_val_on_index then

    Dbms_output.put_line(‘duplicate’);

  When others then

   Dbms_output.put_line(‘others’);

End insertmer;

 

儲存過程呼叫:

Ser serveroutput on

Begin

  Insertmer;

End;

 

或者直接執行:

Execute Insertmer

 

修改儲存過程使用:

 Create or replace

 

 

引數:

Inout,  in out.

該型別的引數值由呼叫者傳入,並且只能夠儲存過程讀取。

例子:

 Create or replace procedure insermer(

   P_id in varchar2,

   P_name in varchar2,

P_price in number,

P_place in varchar2) as

Begin

  Null;

Exception

  Null;

end

 

在帶引數的變數中,不能固定引數的長度

在下面這個過程中,通過out引數返回值,表示在呼叫它時必須提供能夠接收返回值的變數。

 

SYS AS SYSDBA on 2008-03-01 10:28:39 at ORCL>edit

已將 file afiedt.buf 寫入

 

  1  create or replace procedure searchpro(

  2  id in number,

  3  o_name out number,

  4  o_price out number) is

  5  begin

  6    o_name:=id;

  7    o_price:=id+1;

  8  exception

  9   when others then

 10    dbms_output.put_line('o_name:'||o_name||' oprice:'||'oprice');

 11* end searchpro;

SYS AS SYSDBA on 2008-03-01 10:28:55 at ORCL>/

 

已建立程式.

 

SYS AS SYSDBA on 2008-03-01 10:28:58 at ORCL>variable name number;

SYS AS SYSDBA on 2008-03-01 10:29:10 at ORCL>variable price number;

SYS AS SYSDBA on 2008-03-01 10:29:17 at ORCL>exec searchpro(1,name,price);

BEGIN searchpro(1,name,price); END;

 

                  *

 ERROR 在行 1:

ORA-06550: line 1, column 19:

PLS-00201: identifier 'NAME' must be declared

ORA-06550: line 1, column 7:

PL/SQL: Statement ignored

 

 

SYS AS SYSDBA on 2008-03-01 10:29:32 at ORCL>exec searchpro(1,:name,:price);

 

PL/SQL 程式順利完成.

 

SYS AS SYSDBA on 2008-03-01 10:30:03 at ORCL>print name;

 

      NAME

----------

         1

SYS AS SYSDBA on 2008-03-01 10:30:11 at ORCL>print price

 

     PRICE

----------

         2

 

 

SYS AS SYSDBA on 2008-03-01 10:30:15 at ORCL>create or replace procedure swap(p_num1 in out nu

mber,p_num2 in out number) is

  2  var_temp number;

  3  begin

  4   var_temp:=p_num1;

  5   p_num1:=p_num2;

  6  p_num2:=var_temp;

  7  end swap;

  8  /

 

已建立程式.

 

SYS AS SYSDBA on 2008-03-01 10:41:30 at ORCL>set serveroutput on

SYS AS SYSDBA on 2008-03-01 10:41:37 at ORCL>declare

  2   var_max number:=20;

  3  var_min number:=28;

  4  begin

  5   if var_max

  6     swap(var_max,var_min);

  7  end if;

  8  dbms_output.put_line('var_max='||var_max);

  9  dbms_output.put_line('var_min='||var_min);

 10  end;

 11  /

var_max=28

var_min=20

 

在使用in out 引數時,必須為in out 引數提供變數,不可以提供常量,因為out .

在使用int 引數時候,可以使用default 預設值,而在 outin out 引數時,不能使用default 預設值。

 

區域性變數 子過程

同匿名pl/sql 程式塊一樣,過程也可以定義區域性變數

 

SYS AS SYSDBA on 2008-03-01 10:44:55 at ORCL>create or replace procedure updatepro(p_Id in num

ber,p_rebate in number) is

  2  var_rebate number;

  3  procedure checkvalue(rebate in out number) is

  4  begin

  5   if rebate=null then

  6      rebate:=1;

  7  elsif rebate<0 then

  8     rebate:=0.1;

  9  elsif rebate>1 then

 10    rebate:=1;

 11  end if;

 12  end checkvalue;

 13  begin

 14    var_rebate:=p_rebate;

 15    checkvalue(var_rebate);

 16   dbms_output.put_line('var_rebate:'||var_rebate);

 17  end updatepro;

 18  /

 

已建立程式.

 

SYS AS SYSDBA on 2008-03-01 10:56:52 at ORCL>set serveroutput on

SYS AS SYSDBA on 2008-03-01 10:57:37 at ORCL>begin

  2  updatepro(1,2);

  3  end;

  4  /

var_rebate:1

 

PL/SQL 程式順利完成.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/701141/viewspace-198165/,如需轉載,請註明出處,否則將追究法律責任。

相關文章