儲存過程(stored procedure)是在大型資料庫系統中,一組為了完成特定功能的sql 語句集,儲存在資料庫中,經過第一次編譯後再次呼叫不需要再次編譯,使用者通過指定儲存過程的名字並給出引數(如果該儲存過程帶有引數)來執行它。儲存過程是資料庫中的乙個重要物件。
createorreplace
procedure p_test --
建立乙個p_test 儲存過程, 如果存在就覆蓋它;
is--
表明後面是乙個pl/sql體
begin
--pl/sql體開始
null
;end; --
pl/sql體結束
execute p_test;
beginp_test;
end;
控制台輸出顯示
set serveroutput on;
建立乙個帶輸入引數的儲存過程,把查詢結果顯示出來
createorreplace
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;
建立乙個帶輸入引數和輸出引數的儲存過程
createorreplace
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;
呼叫帶輸入和輸出引數的儲存過程
declarein_id
integer
;out_total
number
;begin
in_id:
=7369
;p_test(in_id, out_total);
dbms_output.put_line(out_total);
end;
使用sys_refcursor游標建立乙個結果集儲存過程
createorreplace
procedure
p_test(out_return out sys_refcursor)
isbegin
open out_return for
'select * from emp';
end;
呼叫帶結果集的儲存過程(fetch...into...)
declarecur 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迴圈游標例子
declarecursor 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迴圈
declarecursor 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高效迴圈游標
declarecursor 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、檢視過程狀態
selectobject_name,status from user_objects where object_type=
'procedure
';
2、重新編譯過程
alterprocedure xs_proc compile;
3、檢視過程的源**
select*from user_source where type=
'procedure
';
4、刪除儲存過程
dropprocedure 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...