由於在學習oracle,總會不有自主的將它與微軟的Sql Server相比較,有時候會把自己弄糊塗,就下定決心把這個兩個主流資料庫的預存程序總結一下。說道預存程序,那麼預存程序有什麼優勢呢,相對於在應用程式執行sql語句。
吸收前人的經驗總結下它的優點,主要有四點。
★允許模組化程式設計,以後可以重複調用;可以由專人來完成,並可獨立於程式原始碼而單獨修改。這樣一個項目在需求分析、介面設計以及資料庫設計完了以後,就可以開始寫預存程序了,同一時間資料訪問層也可以開始寫了。沒有必要等詳細設計說明完成了在編碼的時候才開始寫SQL語句。
★執行更快,預存程序都是先行編譯命令,執行起來比SQL語句更快。
★減少網路流量。
★可作為安全機制,能夠屏蔽資料庫,使用者並不知道資料庫的真實結構。
分頁預存程序是最好來說明這個過程的,下面是oracle的語句。
create procedure fenye
(tableName in varchar2, --定義分頁的表名
Pagesize in number, --定義每頁的大小
pageNow in number, --定義當前第幾頁
myrows out number,
myPageCount out number, --定義輸出這個表一共有幾頁
p_cursor out testpackage.test_cursor) is
v_sql varchar2(1000);
v_begin number:=(pageNow-1)*Pagesize+1; --定義某頁開始選第幾行
v_end number:=pageNow*Pagesize; --定義某頁結束第幾行
begin
v_sql:='select * from (select t1.*,rownum rn from (select * from '|| tableName
||') t1 where rownum<='||v_end||') where rn>='||v_begin;
open p_cursor for v_sql;
v_sql:='select count(*) from '|| tableName;
execute immediate v_sql into myrows;
if mod(myrows,Pagesize)=0 then
myPageCount:=myrows/Pagesize;
dbms_output.put_line(myPageCount);
else
myPageCount:=myrows/pagesize+1;
end if;
--close p_cursor;
end;
下面是微軟資料庫的分頁預存程序
create procedure usp_Pagin
@pageSize int,
@pageIndex int,
@pageCount int output
as
declare @count int
select * from
(select row_number() over(order by sId)as num,* from student) as newTable
where num between (@pageSize*(@pageIndex-1)+1) and (@pageSize*@pageIndex)
select @count=count(*) from student
set @pageCount=ceiling(@count/convert(float,@pageSize))
從結構文法來說
微軟 oracle
定義參數 create procedure 過程名 輸入的參數名1,... as create procedure 過程名(輸入的參數名1.....) is
定義變數 declare @變數名 類型(declare @count int) 變數名 類型; //(v_sql varchar2(1000);)
變數賦值 = :=
變數輸入輸出定義 變數名 類型 in/output 變數名 in/out 類型
到現在為止,就這麼多吧!