【发布时间】:2015-07-05 12:16:39
【问题描述】:
我被这个查询卡住了。我尝试转换,但我是 Oracle 11 g 的新手。
这是用 Oracle 11 g 转换的 ms sql 存储过程。
CREATE PROCEDURE [dbo].[GetCustomers_Pager]
@SearchTerm VARCHAR(100) = ''
,@PageIndex INT = 1
,@PageSize INT = 10
,@RecordCount INT OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT ROW_NUMBER() OVER
(
ORDER BY [CustomerID] ASC
)AS RowNumber
,[CustomerID]
,[CompanyName]
,[ContactName]
,[City]
INTO #Results
FROM [Customers]
WHERE [ContactName] LIKE @SearchTerm + '%' OR @SearchTerm = ''
SELECT @RecordCount = COUNT(*)
FROM #Results
SELECT * FROM #Results
WHERE RowNumber BETWEEN(@PageIndex -1) * @PageSize + 1 AND(((@PageIndex -1) * @PageSize + 1) + @PageSize) - 1
DROP TABLE #Results
END
我发现这个ms sql存储过程到this link
这是我失败的 oracle 存储过程。我坚持使用 INTO 语法。
CREATE OR REPLACE
PROCEDURE GetCustomers_Pager
( SearchTerm IN VARCHAR2
, PageIndex IN NUMBER DEFAULT 1
, PageSize IN NUMBER DEFAULT 10
, RecordCount OUT NUMBER
) AS
BEGIN
SELECT
ROW_NUMBER() OVER( ORDER BY CustomerID ASC )AS RowNumber,
,CustomerID
,CompanyName
,ContactName
,City
INTO Results
FROM Customers
WHERE ( Customers LIKE SearchTerm + '%' OR ContactName LIKE SearchTerm + '%') OR SearchTerm = '';
SELECT RecordCount = COUNT(*)
FROM Results;
SELECT * FROM Results
WHERE RowNumber BETWEEN(PageIndex -1) * PageSize + 1 AND(((PageIndex -1) * PageSize + 1) + PageSize) - 1;
DROP TABLE Results;
END GetCustomers_Pager;
谁能帮帮我?
【问题讨论】:
-
你使用什么oracle版本? perhaps this may help.
-
首先要做的是删除
[..]“引号”。这些对于 SQL 标识符无效。 -
我认为原始 SQLServer 过程没有任何意义。似乎是这样做的: 1) 将与联系人姓名匹配的
Customers表中的一堆数据插入到临时表#Results中。 2) 获取#Results的行数到OUT参数RecordCount。 3) 对Results表执行一个模仿分页的冗余查询。分页结果集不在任何地方使用。 4)DROPs 表#Results。除非发生了一些隐藏的 SQLServer 魔法,否则我认为可以使用单个COUNT对Customers表来完成同样的事情。 -
根据您粘贴的过程,您在 SELECT ROW_NUMBER() OVER( ORDER BY CustomerID ASC )AS RowNumber, 处有 2 个逗号,然后 into 子句必须具有与 select 语句中相同数量的参数
-
@MickMnemonic:确实发生了一些“魔术”,该过程将(隐式)返回最后一个 select 语句的结果 - 这就是 Oracle 12c 引入“隐式结果集”的原因,但这在 11g 中不可用。我认为唯一的选择是使用返回结果集的流水线函数,然后从该函数中进行选择。
标签: sql sql-server oracle sql-server-2008 stored-procedures