我坚持这个查询。我尝试转换,但是,我是Oracle 11 g的新手。
这是用Oracle 11g转换的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;
有人可以帮助我吗?
答案 0 :(得分:1)
您只能在var v = new V(typeof(T1), "Member");
var exprT1 = Expression.Lambda<Func<T1, bool>>(v.Visit(exprT.Body), v.Parameter);
子句中使用简单类型变量来选择使用数组SELECT INTO
。但是,您必须声明要选择的变量,并且其类型必须匹配。
如果您只想选择计数,请使用:
SELECT BULK COLLECT INTO
如果要返回记录,则必须定义数组类型,添加输出参数SELECT COUNT(*) INTO RecordCount
FROM (SELECT ROW_NUMBER() OVER( ORDER BY CustomerID ASC )AS RowNumber,
CustomerID,
CompanyName,
ContactName,
City
FROM Customers
WHERE ( Customers LIKE SearchTerm + '%' OR ContactName LIKE SearchTerm + '%') OR SearchTerm = '') s
WHERE RowNumber BETWEEN (PageIndex-1)*PageSize + 1 AND PageIndex*PageSize;
并使用Records
然后SELECT * BULK COLLECT INTO Records
。
但返回数据的首选方法是RecordCount := Records.COUNT;
输出参数,请参阅http://oracle-base.com/articles/misc/using-ref-cursors-to-return-recordsets.php。
答案 1 :(得分:1)
将游标作为输出参数的Oracle过程代码:
CREATE OR REPLACE PROCEDURE GetCustomers_Pager (
SearchTerm IN VARCHAR2, PageIndex IN NUMBER DEFAULT 1, PageSize IN NUMBER DEFAULT 10,
RecordCount OUT NUMBER, Records out sys_refcursor ) AS
begin
-- count all matching rows
select count(1) into RecordCount from Customers
where ContactName like SearchTerm||'%';
-- get all matching rows into cursor "Records"
-- and filter them including PageIndex and PageSize parameters
open Records for
select rn, customerid, companyName, contactName, City
from (
select row_number() over (order by customerID) rn,
customerid, companyName, contactName, City
from customers where ContactName like SearchTerm||'%' )
where rn between (PageIndex-1) * PageSize
and (((PageIndex-1) * PageSize + 1) + PageSize) - 1;
end GetCustomers_Pager;
示例C#代码调用此过程并填充DataGridView:
OracleCommand cmd = new OracleCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "getcustomers_pager";
cmd.Connection = CONNECTION.oconn;
cmd.Parameters.Add(new OracleParameter("SearchTerm", OracleType.VarChar, 3)).Value = "Mar";
cmd.Parameters.Add(new OracleParameter("PageIndex", OracleType.Number)).Value = 1;
cmd.Parameters.Add(new OracleParameter("PageSize", OracleType.Number)).Value = 5;
OracleParameter p = new OracleParameter("RecordCount", OracleType.Number);
p.Direction = ParameterDirection.Output;
cmd.Parameters.Add(p);
p = new OracleParameter("Records", OracleType.Cursor);
p.Direction = ParameterDirection.Output;
cmd.Parameters.Add(p);
OracleDataAdapter da = new OracleDataAdapter();
da.SelectCommand = cmd;
DataSet ds = new DataSet();
da.Fill(ds);
dgv.DataSource = ds.Tables[0];