Oracle內分頁:
創(chuàng)新互聯建站從2013年成立,先為南澳等服務建站,南澳等地企業(yè),進行企業(yè)商務咨詢服務。為南澳企業(yè)網站制作PC+手機+微官網三網同步一站式服務解決您的所有建站問題。
1.首先創(chuàng)建返回結果集的包,代碼如下:
--創(chuàng)建包
create or replace package types as
type cursorType is ref cursor;
end;12341234
2.創(chuàng)建實現分頁查詢的存儲過程:
--創(chuàng)建存儲過程
CREATE OR REPLACE PROCEDURE PROC_GET_DATA_PAGING(P_TABLENAME IN VARCHAR2, --表(視圖)名
P_STRWHERE IN VARCHAR2, --查詢條件
P_ORDERCOLUMN IN VARCHAR2, --排序的列
P_CURPAGE IN OUT NUMBER, --當前頁
P_PAGESIZE IN OUT NUMBER, --每頁顯示記錄條數
P_TOTALRECORDS OUT NUMBER, --總記錄數
P_TOTALPAGES OUT NUMBER, --總頁數
V_CUR OUT TYPES.CURSORTYPE) --返回的結果集
IS
V_SQL VARCHAR2(4000) := ''; --SQL語句
V_STARTRECORD NUMBER(10); --開始顯示的記錄條數
V_ENDRECORD NUMBER(10); --結束顯示的記錄條數
V_SHOWALL INTEGER; --是否顯示全部記錄
BEGIN
--記錄中總記錄條數
V_SQL := 'SELECT TO_NUMBER(COUNT(*)) FROM ' || P_TABLENAME ||
' WHERE 1=1 ';
IF P_STRWHERE IS NOT NULL OR P_STRWHERE '' THEN
V_SQL := V_SQL || P_STRWHERE;
END IF;
EXECUTE IMMEDIATE V_SQL
INTO P_TOTALRECORDS;
--驗證頁面記錄大小
IF P_PAGESIZE = 0 THEN
V_SHOWALL := 1;
P_PAGESIZE := 0;
END IF;
IF V_SHOWALL IS NULL THEN
--根據頁大小計算總頁數
IF MOD(P_TOTALRECORDS, P_PAGESIZE) = 0 THEN
P_TOTALPAGES := TRUNC(P_TOTALRECORDS / P_PAGESIZE, 0);
ELSE
P_TOTALPAGES := TRUNC(P_TOTALRECORDS / P_PAGESIZE, 0) + 1;
END IF;
ELSE
P_TOTALPAGES := 1;
END IF;
--驗證頁號
IF P_CURPAGE 1 THEN
P_CURPAGE := 1;
END IF;
IF P_CURPAGE P_TOTALPAGES THEN
P_CURPAGE := P_TOTALPAGES;
END IF;
--實現分頁查詢
V_STARTRECORD := (P_CURPAGE - 1) * P_PAGESIZE + 1;
V_ENDRECORD := P_CURPAGE * P_PAGESIZE;
V_SQL := 'SELECT * FROM (SELECT A.*, ROWNUM R FROM ' ||
'(SELECT * FROM ' || P_TABLENAME;
IF P_STRWHERE IS NOT NULL OR P_STRWHERE '' THEN
V_SQL := V_SQL || ' WHERE 1=1 ' || P_STRWHERE;
END IF;
IF P_ORDERCOLUMN IS NOT NULL OR P_ORDERCOLUMN '' THEN
V_SQL := V_SQL || ' ORDER BY ' || P_ORDERCOLUMN;
END IF;
IF V_SHOWALL IS NULL THEN
V_SQL := V_SQL || ') A WHERE ROWNUM = ' || V_ENDRECORD ||
') B WHERE R = ' || V_STARTRECORD;
ELSE
V_SQL := V_SQL || ') A ) B ';
END IF;
DBMS_OUTPUT.PUT_LINE(V_SQL);
OPEN V_CUR FOR V_SQL;
END PROC_GET_DATA_PAGING;123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
一定要先創(chuàng)建返回結果集的包,否則編譯存儲過程有問題。
首先你定義一個直接游標,比如c,然后直接open c for select 你要的列 from 表a union all select 你要的列 from 表b union all select 你要的列 from 表c 等等(每個表名后可以有自己的where條件)。
也可以把union all 換成union 不同的是union all 直接合并數據集不去重復數據,union 會移除數據集間的重復數據,因為union 去重,所以性能不如union all,選擇哪個自己考慮。
至于說游標影響性能,無稽之談。所有的dml和dql語句都會聲明一個游標,區(qū)別在于顯式或者隱式。性能問題在于你sql的寫法,不在是不是游標。
游標能夠根據查詢條件從數據表中提取一組記錄,將其作為一個臨時表置于數據緩沖區(qū)中,利用指針逐行對記錄數據進行操作。
Oracle中的游標分為顯示游標和隱式游標 。
在執(zhí)行SQL語句時,Oracle會自動創(chuàng)建隱式游標,該游標是內存中處理該語句的數據緩沖區(qū),存儲了執(zhí)行SQL語句的結果。通過隱式游標屬性可獲知SQL語句的執(zhí)行狀態(tài)信息。
%found:布爾型屬性,如果sql語句至少影響到一行數據,值為true,否則為false。
%notfound:布爾型屬性,與%found相反。
%rowcount:數字型屬性,返回受sql影響的行數。
%isopen:布爾型屬性,當游標已經打開時返回true,游標關閉時則為false。
用戶可以顯式定義游標。使用顯式游標處理數據要4個步驟:定義游標、打開游標、提取游標數據和關閉游標。
游標由游標名稱和游標對應的select結果集組成。定義游標應該放在pl/sql程序塊的聲明部分。
語法格式:cursor 游標名稱(參數) is 查詢語句
打開游標時,游標會將符合條件的記錄送入數據緩沖區(qū),并將指針指向第一條記錄。
語法格式:open 游標名稱(參數);
將游標中的當前行數據賦給指定的變量或記錄變量。
語法格式:fetch 游標名稱 into 變量名;
游標一旦使用完畢,就應將其關閉,釋放與游標相關聯的資源。
語法格式:close 游標名稱;
declare
cursor c1 is? select sno,cno,grade from sc;
v_sno sc.sno%type;
v_cno sc.cno%type;
v_grade sc.grade%type;
begin
open c1;
loop
? fetch c1 into v_sno,v_cno,v_grade;
? exit when c1%notfound;--緊跟fetch之后
if c1%found then
dbms_output.put_line(to_char(c1%rowcount)||v_cno);
end if;
end loop;
close c1;?
end;
declare
cursor c1 is select sno,cno,grade from sc;
v_sno sc.sno%type;
v_cno sc.cno%type;
v_grade sc.grade%type;
begin
open c1;
fetch c1 into v_sno,v_cno,v_grade;
while c1%found loop
? dbms_output.put_line(v_sno||v_cno||v_grade);
?fetch c1 into v_sno,v_cno,v_grade;
end loop;
close c1;?
end;
第三種:for
declare
cursor c1 is select sno,cno,grade from sc;
begin
for item in c1 loop
dbms_output.put_line(rpad(item.sno,'10',' ')||rpad(item.cno,'10',' ')||rpad(item.grade,'10',' '));
end loop;
end;
SELECT 字段1,字段2,??????,字段n INTO 變量1,變量2,??????,變量n FROM 表名;
這樣寫試一下,看看是否好用。
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
連接到:
Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production
SQL show parameter open_cursors;
NAME TYPE VALUE
------------------------------------ ----------- -------------------
open_cursors integer 3002、查看當前打開的游標數目
SQL select count(*) from v$open_cursor;
COUNT(*)
----------174943、修改Oracle最大游標數
SQL alter system set open_cursors=1000 scope=both;
系統已更改。
文章題目:oracle游標怎么查詢,oracle游標查詢吃內存么?
當前URL:http://www.yijiale78.com/article20/hcseco.html
成都網站建設公司_創(chuàng)新互聯,為您提供網站收錄、用戶體驗、標簽優(yōu)化、網站內鏈、企業(yè)網站制作、企業(yè)建站
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯