Oracle中儲存過程

2021-07-23 08:05:36 字數 3677 閱讀 7407

1、建立乙個儲存過程

create [or replace] procedure pro_name [(parameter1 [,parameter2])] is|as

begin

plsql_sentences; --pl/sql語句,儲存過程功能實現的主體

[exception]

[dowith_sentences;] --異常處理語句,也是pl/sql語句,是個可選項

end [pro_name]

/

呼叫:

execute pro_name(也可以簡寫為exec)

1.1、in模式引數:

這是一種輸入型別的引數,引數值由呼叫方傳入,並且只能被儲存過程讀取(最常用)

create or replace procedure deldept(num_deptno in number,dname in varchar2,loc in varchar2) is

begin

insert into dept d values(num_deptno,dname,loc);

commit;

end deldept;

/

呼叫:

execute deldept(10,'產品部','上海'); ----此呼叫方式是按位置傳遞:必須按照儲存過程定義引數的順序

execute deldept(num_deptno=>11,dname=>'it部門',loc=>'北京'); ----此呼叫方式是指定名稱傳遞:即引數名在左邊,中間是賦值符號"=>",右側是引數值

在呼叫時也可以使用兩種方式進行混合

1.2、out模式引數:

這是一種輸出型別的引數,表示這個引數在儲存過程中已經被賦值,並且這個引數值可以傳遞到當前儲存過程以外的環境中

create or replace procedure seldept(

num_deptno in number,

var_dname out varchar2,

var_loc out varchar2

) is

begin

select d.dname,d.loc into var_dname,var_loc from dept d where d.deptno = num_deptno;

exception

when no_data_found then

dbms_output.put_line('該部門編號不存在');

end seldept;

/

呼叫:

variable var_dname varchar2(50);

variable var_loc varchar2(50);

execute seldept(50,:var_dname,:var_loc);

print var_dname var_loc;

用execute命令執行out模式的儲存過程需要使用variable關鍵字宣告兩個變數,用以儲存out引數的返回值

set serverout on

declare

var_dname dept.dname%type;

var_loc dept.loc%type;

begin

seldept(50,var_dname,var_loc);

dbms_output.put_line(var_dname || '位於' || var_loc);

end;

/

這裡是將宣告的兩個變數傳入到儲存過程中,當儲存過程執行時,其中的out引數會被賦值,當儲存過程執行完畢,out引數的值會在呼叫處返回,這樣定義的兩個變數就可以得到out引數被賦予的值,最後這兩個值就可以在儲存過程以外任意使用了

注意:如果在儲存過程中宣告了out模式的引數,則在執行儲存過程時,必須為out引數提供變數,以便接受out引數的返回值,否則,程式執行後將出現錯誤

1.3、in out 模式引數:

在呼叫儲存過程時,可以從外界向該型別的引數傳入值,在執行完儲存過程後,可以將該值返回給外界

create or replace procedure prosquare(num in out number,flag in boolean) is

i int := 2;

begin

if flag then

num := power(num,i);

else

num := sqrt(num);

end if;

end;

/

呼叫

declare

var_number number;

var_temp number;

boo_flag boolean;

begin

var_temp := 3;

var_number := var_temp;

boo_flag := false;

prosquare(var_number,boo_flag);

if boo_flag then

dbms_output.put_line(var_temp || '的平方是:' || var_number);

else

dbms_output.put_line(var_temp || '的平方根是:' || var_number);

end if;

end;

/

1.4、in引數的預設值

oracle支援在申明in引數的同時給其初始化預設值,這樣在呼叫儲存過程時,即使沒有向in引數傳入值,儲存過程也可以使用預設值進行操作。

create or replace procedure insertdept(

num_deptno in number,

var_dname in varchar2 default '綜合部',

var_loc in varchar2 default '天津') is

begin

insert into dept values(num_deptno,var_dname,var_loc);

commit;

end;

/

呼叫

execute insertdept(num_deptno=>30);--最好使用「指定名稱傳遞

」方式傳值

execute insertdept(30);

總結:儲存過程是一種命名的pl/sql程式塊,它即可以沒有引數,也可以有若干個輸入、輸出引數,甚至可以有多個即作輸入又作輸出的引數,但它通常沒有返回值。儲存過程被儲存在資料庫中,它不可以被sql語句直接執行或呼叫,只能通過execute命令執行或在pl/sql程式塊內部被呼叫。由於儲存過程時已經編譯好的**,所以其被呼叫或引用時,執行效率非常高。

Oracle 中儲存過程的建立

在oracle 中用到的視覺化的開發工具是pl sql 其儲存過程也和在sql中的無二。今天也算是複習一下舊知識。是什麼?是乙個 集 也可以理解成是乙個程式塊。它在資料庫中來實現功能。為什麼用?1快 因為資料庫接收到從程式中傳過來的 語句,資料庫還要進行編譯成自己認識的語言 即程式每執行一次就編譯一...

mysql中儲存過程

delimiter,簡單解釋下這個命令的用途,在mysql中每行命令都是用 結尾,回車後自動執行,在儲存過程中 往往不代表指令結束,馬上執行,而delimiter原本就是 的意思,因此用這個命令轉換一下 為 這樣只有收到 才認為指令結束可以執行 檢視myql中已經存在的儲存過程 show proce...

mysql中儲存過程

儲存過程,其本質還是函式 但其規定 不能有返回值 說明 1,in 用於設定該變數是用來 接收實參資料 的,即 傳入 預設不寫,就是in 2,out 用於設定該變數是用來 儲存儲存過程中的資料 的,即 傳出 即函式中必須對它賦值 3,inout 是in和out的結合,具有雙向作用 4,對於,out和i...