Oracle 儲存過程

2022-08-21 08:06:10 字數 3157 閱讀 2143

儲存過程:

是乙個命名的pl/sql程式塊,儲存在資料庫中,不可以被sql語句直接執行或呼叫,只能通過execut命令執行或在pl/sql程式塊內部被呼叫。由於儲存過程是已經編譯好的**,所以其被呼叫或引用時,執行效率非常高。

例子在當前模式下,如果資料庫中存在同名的儲存過程,則要求新建立的儲存過程覆蓋掉已存在的儲存過程;如果不存在同名的儲存過程,則直接建立即可

create or replace procedure pro_insertdept is/as

begin

insert into dept values(99,'市場拓展部','beijing');

commit;

dbms_output.put_line('插入新記錄成功!');

end pro_insertdept;

/這個儲存過程,只是建立成功,insert語句僅僅是編譯了,並沒有被執行。若要執行這個insert語句,則需要在sql *plus中使用execute

執行該儲存過程:execute pro_insertdept;

或者在pl/sql程式塊中呼叫該儲存過程:

set serverout on 

begin

pro_insertdept;

end;

/

儲存過程的引數

為了增強儲存過程的靈活性,可以實現向儲存過程傳入引數。引數是一種向程式單元輸入和輸出資料的機制,儲存過程可以接受多個引數,引數模式包括in,out,in out

in引數

建立乙個儲存過程,並定義3個in模式的變數,然後將3個變數的值插入到dept表中

create or replace procedure insert_dept(

num_deptno in number,

var_ename in varchar2,

var_loc in varchar2) is

begin

insert into dept

values(num_deptno,var_ename,var_loc);

commit;

end insert_dept;

/向儲存過程傳入引數有3種方式:

1.指定名稱傳遞:引數名稱=>引數值 

2.按位置傳遞:使用者提供的引數值順序必須與儲存過程中定義的順序相同。

注意:有時候在引數較多時,使用者不容易記住引數的順序和型別,使用者可以通過desc命令來檢視儲存過程中引數的定義資訊。

3.混合方式:比如 insert_dept(38,var_loc=>'濟南',var_ename=>'測試部');

注意:in引數的預設值

var_dname in varchar2default '綜合部'

out引數

建立乙個儲存過程,要求定義兩個out模式的字元型別的引數,然後在dept表中檢索到一行部門資訊儲存到這兩個引數中

create or replace procedure select_dept(

num_deptno in number,

var_dname out dept.dname%type,

var_loc out dept.loc%type)is

begin

select dname,loc

into var_dname,var_loc

from dept

where deptno= num_deptno;

exception

when no_data_found then

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

end select_dept;

/執行儲存過程:

variable var_dname varchar2(50);

variable var_loc varchar2(50);

exec select_dept(25,:var_dname,:var_loc);

檢視輸出變數:

print var_dname var_loc;

或者select :var_dname,:var_loc from dual;

in out 引數:

建立乙個儲存過程,在其中定義乙個「in out」引數,該儲存引數用來計算這個引數的平方或平方根

create or replace procedure pro_square(

num in out number,

flag in boolean) is

begin

if flag then

num:=power(num,2);

else

num:=sqrt(num);

end if;

end;

/呼叫儲存過程pro_square,計算某個數的平方或平方根

declare

var_number number; --儲存要進行運算的值和運算後的結果

var_temp number; --儲存要進行運算的值

boo_flag boolean;

begin

var_temp:=3;

var_number:=var_temp;

boo_flag:=false;

pro_square(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;

/

Oracle儲存過程呼叫儲存過程

oracle儲存過程呼叫有返回結果集的儲存過程一般用光標的方式,宣告乙個游標,把結果集放到游標裡面,然後迴圈游標 declare newcs sys refcursor cs1 number cs2 number cstype table rowtype table列的個數和newcs返回的個數一樣...

ORACLE儲存過程

自定義函式開始 create or replace function fn wftemplateidget templatecategoryid number,organid number,templatemode number return number istemplateid number i...

Oracle 儲存過程

create or replace procedure p 有就替換,沒有就建立 iscursor c is select from emp for update begin for v emp in c loop if v emp.deptno 10 then update emp2 set sa...