如何将MS SQL存储过程转换为Oracle

时间:2015-04-27 06:53:21

标签: sql sql-server oracle sql-server-2008 stored-procedures

我坚持这个查询。我尝试转换,但是,我是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;

有人可以帮助我吗?

2 个答案:

答案 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];
相关问题