Oracle 儲存過程

2022-05-08 04:06:12 字數 4714 閱讀 3055

儲存過程(stored procedure)是在大型資料庫系統中,一組為了完成特定功能的sql 語句集,儲存在資料庫中,經過第一次編譯後再次呼叫不需要再次編譯,使用者通過指定儲存過程的名字並給出引數(如果該儲存過程帶有引數)來執行它。儲存過程是資料庫中的乙個重要物件。

create

orreplace

procedure p_test --

建立乙個p_test 儲存過程, 如果存在就覆蓋它;

is--

表明後面是乙個pl/sql體

begin

--pl/sql體開始

null

;end; --

pl/sql體結束

execute p_test;

begin

p_test;

end;

控制台輸出顯示

set serveroutput on;

建立乙個帶輸入引數的儲存過程,把查詢結果顯示出來

create

orreplace

procedure p_test(in_id in

integer)is

p_ename

varchar2(20

);error_message

varchar2(100

);begin

select ename into p_ename from emp where empno =

in_id;

exception

when others then

error_message :

=sqlerrm;

dbms_output.put_line (error_message);

raise;

dbms_output.put_line(p_ename);

end;

建立乙個帶輸入引數和輸出引數的儲存過程

create

orreplace

procedure p_test(in_id in

integer, out_total out number)is

error_message

varchar2(100

);begin

select nvl(sal, 0) + nvl(comm, 0) into out_total from emp where empno =

in_id;

exception

when others then

error_message :

=sqlerrm;

dbms_output.put_line (error_message);

raise;

dbms_output.put_line(out_total);

end;

呼叫帶輸入和輸出引數的儲存過程

declare

in_id

integer

;out_total

number

;begin

in_id:

=7369

;p_test(in_id, out_total);

dbms_output.put_line(out_total);

end;

使用sys_refcursor游標建立乙個結果集儲存過程

create

orreplace

procedure

p_test(out_return out sys_refcursor)

isbegin

open out_return for

'select * from emp';

end;

呼叫帶結果集的儲存過程(fetch...into...)

declare

cur sys_refcursor;

rowinfo emp

%rowtype;

begin

p_test(cur);

loop

fetch cur into

rowinfo;

exit

when cur%

notfound;

dbms_output.put_line(rowinfo.empno||'

,'||rowinfo.ename);

endloop;

close

cur;

end;

cursor游標for...in...loop迴圈游標例子

declare

cursor cur is

select

*from

emp;

rowinfo emp

%rowtype;

begin

for rowinfo in

cur loop

sys.dbms_output.put_line(rowinfo.empno||'

,'||rowinfo.ename);

endloop;

end;

cursor游標while迴圈

declare

cursor cur is

select

*from

emp;

v_myemp emp

%rowtype;

begin

open

cur;

fetch cur into

v_myemp;

while cur%

found loop

dbms_output.put_line(v_myemp.ename);

fetch cur into

v_myemp;

endloop;

end;

bulk collectg高效迴圈游標

declare

cursor cur is

select

*from

emp;

type rowin

istable

of emp%rowtype; --

type 宣告是型別, is table of 指定是乙個集合的表的陣列型別,emp表上%rowtype 指在表上的行的資料型別.

rowinfo rowin;

begin

open

cur;

loop

fetch cur bulk collect into rowinfo limit 3; --

bulk collect into 指是乙個成批聚合型別,它可以儲存乙個多行多列儲存型別

for i in

1..rowinfo.count

loop

dbms_output.put_line (rowinfo(i).empno||'

,'||rowinfo(i).ename); --

(i)表示下標號

endloop;

exit

when cur%notfound; --

判斷游標結束

endloop;

end;

bulk collect 子句會批量檢索結果,即一次性將結果集繫結到乙個集合變數中,並從sql引擎傳送到pl/sql引擎。通常可以在select into、fetch into以及returning into子句中使用bulk collect.

bulk collect的限制不能對使用字串型別作鍵的關聯陣列使用bulk collect 子句。

只能在伺服器端的程式中使用bulk collect,如果在客戶端使用,就會產生乙個不支援這個特性的錯誤。

bulk collect into 的目標物件必須是集合型別。

復合目標(如物件型別)不能在returning into 子句中使用。

如果有多個隱式的資料型別轉換的情況存在,多重復合目標就不能在bulk collect into 子句中使用。

如果有乙個隱式的資料型別轉換,復合目標的集合(如物件型別集合)就不能用於bulk collectinto 子句中。

維護儲存過程

1、檢視過程狀態

select

object_name,status from user_objects where object_type=

'procedure

';

2、重新編譯過程

alter

procedure xs_proc compile;

3、檢視過程的源**

select

*from user_source where type=

'procedure

';

4、刪除儲存過程

drop

procedure xs_proc;

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...