17,086
社区成员
发帖
与我相关
我的任务
分享
CREATE PROCEDURE GetRecordFromPage
@tblName varchar(255), -- 表名
@RetColumns varchar(1000) = '*', -- 需要返回的列,默认为全部
@Orderfld varchar(255), -- 排序字段名
@PageSize int = 10, -- 页尺寸
@PageIndex int = 1, -- 页码
@IsCount bit = 0, -- 返回记录总数, 非 0 值则返回
@OrderType varchar(50) = 'asc', -- 设置排序类型, 非 asc 值则降序
@strWhere varchar(1000) = '' -- 查询条件 (注意: 不要加 where)
AS
declare @strSQL varchar(1000) -- 主语句
declare @strTmp varchar(300) -- 临时变量
declare @strOrder varchar(400) -- 排序类型
if @IsCount != 0 --执行总数统计
begin
if @strWhere != ''
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where' + @strWhere
else
set @strSQL = 'select count(*) as Total from [' + @tblName + ']'
end
else --执行查询操作
begin
if @OrderType != 'asc'
begin
set @strTmp = '<(select min'
set @strOrder = ' order by [' + @Orderfld +'] desc'
end
else
begin
set @strTmp = '>(select max'
set @strOrder = ' order by [' + @Orderfld +'] asc'
end
set @strSQL = 'select top ' + str(@PageSize) + ' ' + @RetColumns + ' from ['
+ @tblName + '] where [' + @Orderfld + ']' + @strTmp + '(['
+ @Orderfld + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['
+ @Orderfld + '] from [' + @tblName + ']' + @strOrder + ') as tblTmp)'
+ @strOrder
if @strWhere != ''
set @strSQL = 'select top ' + str(@PageSize) + ' ' + @RetColumns + ' from ['
+ @tblName + '] where [' + @Orderfld + ']' + @strTmp + '(['
+ @Orderfld + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['
+ @Orderfld + '] from [' + @tblName + '] where (' + @strWhere + ') '
+ @strOrder + ') as tblTmp) and (' + @strWhere + ') ' + @strOrder
if @PageIndex = 1
begin
set @strTmp=''
if @strWhere!=''
set @strTmp = ' where (' + @strWhere + ')'
set @strSQL = 'select top ' + str(@PageSize) + ' ' + @RetColumns + ' from ['
+ @tblName + ']' + @strTmp + ' ' + @strOrder
end
end
exec (@strSQL)
CREATE or replace
PROCEDURE GetRecordFromPage(
tblName VARCHAR2, -- 表名
RetColumns VARCHAR2 DEFAULT 't.*', -- 需要返回的列,默认为全部
Orderfld VARCHAR2, -- 排序字段名
PageSize NUMBER DEFAULT 10, -- 页尺寸
PageIndex NUMBER DEFAULT 1, -- 页码
IsCount NUMBER DEFAULT 0, -- 返回记录总数, 非 0 值则返回
OrderType VARCHAR DEFAULT 'asc', -- 设置排序类型, 非 asc 值则降序
strWhere VARCHAR DEFAULT NULL , -- 查询条件 (注意: 不要加 where)
cur OUT sys_refcursor )
AS
strSQL VARCHAR(1000); -- 主语句
--strTmp VARCHAR(300); -- 临时变量
strOrder VARCHAR(400); -- 排序类型
BEGIN
IF IsCount != 0 THEN --执行总数统计
OPEN cur FOR 'select count(*) as Total from '||tblName||
CASE
WHEN strWhere IS NOT NULL THEN
' where ' ||strWhere
END;
ELSE --执行查询操作
strOrder := ' order by ' ||Orderfld||' ' ||
CASE orderType
WHEN 'asc' THEN
'asc'
ELSE
'desc'
END;
strSQL := 'select '||retcolumns||' from (select '||RetColumns||','
||'row_number()over('||strOrder||') rn from ' ||tblName ||' t'||
CASE
WHEN strWhere IS NOT NULL THEN
' where '||strWhere
END ||strOrder || ') where rn<=:1 and rn>:2';
OPEN cur FOR strsql USING PageSize*PageIndex,PageSize*(PageIndex-1);
END IF;
END;
variable c1 refcursor;
BEGIN
GetRecordFromPage(tblName=>'emp',RetColumns=>'empno,ename,sal',Orderfld=>'sal',PageSize=>5,
PageIndex=>2,strWhere=>'comm is null',OrderType=>'desc',cur=>:c1);
END;
/
print c1;
匿名块已完成
C1
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
EMPNO ENAME SAL
---------------------- ---------- ----------------------
7782 CLARK 2450
7934 MILLER 1300
7876 ADAMS 1100
7900 JAMES 950
7369 SMITH 800
CREATE OR REPLACE PROCEDURE TABLEPAGE_SELECT(v_page_size int, --the size of a page of list
v_current_page int, --the current page of list
v_table_name varchar2, --the talbe name
v_order_field varchar2,--the order field
v_order_sequence varchar2,--the order sequence should by "_desc"or "_asc",_is blank.
--v_sql_select varchar2, --the select sql for procedure
--v_sql_count varchar2, --the count sql for procedure
--v_out_recordcount OUT int, --the num of return rows
p_cursor OUT refcursor_pkg.return_cursor) as
v_sql varchar2(3000); --the sql for select all rows of list
v_sql_count varchar2(3000); --the count sql for procedure
v_sql_order varchar2(2000); --the order of list
v_count int; -- the amount rows fo original list
v_endrownum int; --the end row num of the current page
v_startrownum int; --the start row num of the current page
BEGIN
----set the order of list
if v_order_field!='NO' then
v_sql_order :=' ORDER BY '|| v_order_field ||' '||v_order_sequence;
else
v_sql_order :='';
end if;
----catch the amount rows of list
v_sql_count:='SELECT COUNT(ROWNUM) FROM '||v_table_name;
execute immediate v_sql_count into v_count;
-- v_out_recordcount := v_count;
----set the value of start and end row
if v_order_sequence='desc' then
v_endrownum:=v_count-(v_current_page-1)*v_page_size;
v_startrownum:=v_endrownum - v_page_size + 1;
else
v_endrownum:= v_current_page * v_page_size;
v_startrownum := v_endrownum - v_page_size + 1;
end if;
----the sql for page slide
v_sql := 'SELECT * FROM (SELECT '||v_table_name||'.*, rownum rn FROM '||v_table_name||' WHERE rownum <= ' ||
to_char(v_endrownum) ||' '|| v_sql_order||') WHERE rn >= ' ||
to_char(v_startrownum)||' '||v_sql_order;
open p_cursor for v_sql;
END TABLEPAGE_SELECT;
备注:输入order by 的sqeuence是,应该为“ desc”或者“ asc”
若输入两个order by则,v_order_field=" a[sequence] ,order by b "
CREATE
PROCEDURE GetRecordFromPage(
tblName VARCHAR2, -- 表名
RetColumns VARCHAR2 DEFAULT '*', -- 需要返回的列,默认为全部
Orderfld VARCHAR2, -- 排序字段名
PageSize NUMBER DEFAULT 10, -- 页尺寸
PageIndex NUMBER DEFAULT 1, -- 页码
IsCount NUMBER DEFAULT 0, -- 返回记录总数, 非 0 值则返回
OrderType VARCHAR DEFAULT 'asc', -- 设置排序类型, 非 asc 值则降序
strWhere VARCHAR DEFAULT NULL , -- 查询条件 (注意: 不要加 where)
cur OUT sys_refcursor )
AS
strSQL VARCHAR(1000); -- 主语句
--strTmp VARCHAR(300); -- 临时变量
strOrder VARCHAR(400); -- 排序类型
BEGIN
IF IsCount != 0 THEN --执行总数统计
OPEN cur FOR 'select count(*) as Total from '||tblName||
CASE
WHEN strWhere IS NOT NULL THEN
' where ' ||strWhere
END;
ELSE --执行查询操作
strOrder := ' order by ' ||Orderfld||' ' ||
CASE orderType
WHEN 'asc' THEN
'asc'
ELSE
'desc'
END;
strSQL := 'select '||retcolumns||' from(' || 'select t.*,rownum rn from' ||'(select '||RetColumns||' from ' ||tblName ||
CASE
WHEN strWhere IS NOT NULL THEN
' where '||strWhere
END ||strOrder || ')t where rownum<=:1 ' ||') where rn>:2';
OPEN cur FOR strsql USING PageSize*PageIndex,PageSize*(PageIndex-1);
END IF;
END;