我想对大数据进行分页。并在每次单击页面时获得100条记录,并且还希望使用Oracle数据库返回“页码,总计记录”。这里的问题是我对Oracle完全不了解。但是我已经在SQL Server中进行了查询。
但是客户端需要在Oracle中执行该查询。在SQL Server中,我通过选择到临时表中,然后根据开始和结束参数获取行来计算了分页部分。如果我们需要每页发送100条记录作为响应。我正在尝试将此SQL Server查询转换为Oracle查询。
SQL Server查询:
ALTER PROCEDURE [dbo].[abccccc]
@PageNumber varchar(max)=null,
@dtfrom varchar(100) = '',
@dtto varchar(100) = '',
@Search varchar(max)=null
AS
DECLARE @RowsPerPage int = 10
declare @start int=0
declare @end int=0
declare @NumOfRecords int=0
IF @PageNumber IS NULL OR @PageNumber = ''
BEGIN
SET @PageNumber = 1 --by default pageno will be 1
END
set @start = ((@PageNumber - 1) * @RowsPerPage) + 1 --calculating start page
set @end = (@RowsPerPage * (@PageNumber)) --calculating end page
print @start
print @end
BEGIN
--putting data in temp table
select ROW_NUMBER() over (order by ProposerId desc) as SRNO,* into #tmp1 from(
select * from [dbo].[TTB_ProposerDetails] where Active = 1) as data where ((convert(date,CreatedOn,103) <= convert(date,@dtto,103) and
convert(date,CreatedOn,103) >= convert(date,@dtfrom,103) OR IsNull(@dtfrom,'') = '' or IsNull(@dtto ,'') = '')) and
(FirstName like '%' + @Search + '%' or isnull(@Search,'')='' or AccountNo like '%' + @Search + '%' or isnull(@Search,'')=''or
LastName like '%' + @Search + '%' or isnull(@Search,'')='')
set @NumOfRecords=(select count(*) from #tmp1)
select * from #tmp1 where SRNO between @start and @end --fetch from temp tbl
drop table #tmp1
select 'Success' as msg,1 as n,@NumOfRecords as ipara1,(@NumOfRecords/@RowsPerPage) ipara2, @PageNumber as ipara3
END
END
我尝试将SQL Server代码转换为Oracle代码。
CREATE OR REPLACE PROCEDURE abc(
p_PageNumber varchar DEFAULT null,
p_dtfrom varchar2 DEFAULT '',
p_dtto varchar2 DEFAULT '',
p_Search varchar DEFAULT null), cur OUT SYS_REFCURSOR, cur2 OUT SYS_REFCURSOR
AS
v_RowsPerPage number(10) := 10;
v_start number(10):=0;
v_end number(10):=0;
v_NumOfRecords number(10):=0;
BEGIN
BEGIN
IF p_PageNumber IS NULL OR p_PageNumber = ''
THEN
p_PageNumber := 1;
END IF;
v_start := ((p_PageNumber - 1) * v_RowsPerPage) + 1;
v_end := (v_RowsPerPage * (p_PageNumber));
print v_start
print v_end
BEGIN
select ROW_NUMBER() over (order by ProposerId desc) as SRNO,* into #tmp1 from(
select * from TTB_ProposerDetails where Active = 1) as data where ((convert(date,CreatedOn,103) <= convert(date,p_dtto,103) and
convert(date,CreatedOn,103) >= convert(date,p_dtfrom,103) OR NVL(p_dtfrom,'') = '' or NVL(p_dtto ,'') = '')) and
(FirstName like '%' || p_Search || '%' or nvl(p_Search,'')='' or AccountNo like '%' || p_Search || '%' or nvl(p_Search,'')=''or
LastName like '%' || p_Search || '%' or nvl(p_Search,'')='')
select count(*) INTO v_NumOfRecords from #tmp1;
open cur for select * from #tmp1 where SRNO between v_start and v_end;
drop table #tmp1;
open cur2 for select 'Success' as msg,1 as n,v_NumOfRecords as ipara1,(v_NumOfRecords/v_RowsPerPage) ipara2, p_PageNumber as ipara3 from dual;
END
END
END;
但是,我遇到一个错误。
CREATE PROC dbo.Sp_SearchData
(
@PageIndex INT = 1, ---Here We set the Default value to Page No.(i.e.PageIndex)
@PageSize INT = 15, -- and PageSize ie. How many Records do want?
@Mode INT = NULL,
@Name VARCHAR(50) = NULL,
@Address VARCHAR(50) = NULL
)
AS
BEGIN
IF(@Mode=1)
BEGIN
SELECT ROW_NUMBER()OVER
(
ORDER BY ID DESC ---Select Your Column That you want Order wise data
)
AS
RowNumber,
ID,
NAME,ADDRESS ---Put All Your Column Name
INTO #Results ---Here We Dumping the Data In temp Table
FROM TableName
WHERE NAME LIKE ISNULL('%'+(@Name)+'%','')
AND ADDRESS LIKE ISNULL('%'+(@Address)+'%','')
ORDER BY ID
SELECT * FROM #Results --Here you will Get All your Pagination
WHERE RowNumber BETWEEN(@PageIndex -1) * @PageSize + 1 AND(((@PageIndex -1) * @PageSize + 1) + @PageSize) - 1
SELECT COUNT(*) AS TotalNumberOfRecords FROM #Results ---Here you will Get Total No. of Records
DROP TABLE #Results
END
END
用于测试存储过程的脚本:-
EXEC dbo.Sp_SearchData
@PageIndex = '2', ---Here i'm Getting All the Records PageNo.--2 data
@PageSize ='15', ---Increase the No. of Records that you want at single time here i'm set 15 ...you can set 100 or more
@Mode='1',
@Name='',
@Address=''
注:-阅读所有注释...开发了自己的逻辑...您将获得输出.....
编辑后:-
begin
declare
PageIndex number;
PageSize number;
Name varchar2(50);
Address varchar2(50);
begin
null;
end;
PageIndex := 1;
PageSize := 15;
Name := '';
Address := '';
create table #Results
as
select
row_number() over (order by ID desc) RowNumber,
ID,
NAME,
ADDRESS ADDRESS
from TableName
where (
NAME like nvl((('%' + @Name) + '%'), '')
and ADDRESS like nvl((('%' + @Address) + '%'), '')
)
order by ID;
select *
from #Results
where RowNumber between (((@PageIndex - 1) * @PageSize) + 1) and (((((@PageIndex - 1) * @PageSize) + 1) + @PageSize) - 1);
select count(*) TotalNumberOfRecords
from #Results;
Drop table #Results Purge;
end;
我已将以上查询转换为Oracle 11g
使用此网站:-https://www.jooq.org/translate/
注意:-我不确定这行Drop table #Results Purge;尝试找出如何在oracle 11 g中删除临时表的方法。...我不确定。...
Please checkout this I am getting an error. I tried converting my sql server code to Oracle one. Please help.
CREATE OR REPLACE PROCEDURE abc(
p_PageNumber varchar DEFAULT null,
p_dtfrom varchar2 DEFAULT '',
p_dtto varchar2 DEFAULT '',
p_Search varchar DEFAULT null), cur OUT SYS_REFCURSOR, cur2 OUT SYS_REFCURSOR
AS
v_RowsPerPage number(10) := 10;
v_start number(10):=0;
v_end number(10):=0;
v_NumOfRecords number(10):=0;
BEGIN
BEGIN
IF p_PageNumber IS NULL OR p_PageNumber = ''
THEN
p_PageNumber := 1;
END IF;
v_start := ((p_PageNumber - 1) * v_RowsPerPage) + 1;
v_end := (v_RowsPerPage * (p_PageNumber));
print v_start
print v_end
BEGIN
select ROW_NUMBER() over (order by ProposerId desc) as SRNO,* into #tmp1 from(
select * from TTB_ProposerDetails where Active = 1) as data where ((convert(date,CreatedOn,103) <= convert(date,p_dtto,103) and
convert(date,CreatedOn,103) >= convert(date,p_dtfrom,103) OR NVL(p_dtfrom,'') = '' or NVL(p_dtto ,'') = '')) and
(FirstName like '%' || p_Search || '%' or nvl(p_Search,'')='' or AccountNo like '%' || p_Search || '%' or nvl(p_Search,'')=''or
LastName like '%' || p_Search || '%' or nvl(p_Search,'')='')
select count(*) INTO v_NumOfRecords from #tmp1;
open cur for select * from #tmp1 where SRNO between v_start and v_end;
drop table #tmp1;
open cur2 for select 'Success' as msg,1 as n,v_NumOfRecords as ipara1,(v_NumOfRecords/v_RowsPerPage) ipara2, p_PageNumber as ipara3 from dual;
END
END
END;