2015-04-27 2 views
1

Я застрял в этом запросе. Я пытаюсь преобразовать, но, я новичок в Oracle 11 г.Как преобразовать хранимую процедуру MS SQL в Oracle

Это хранимая процедура ms sql для преобразования с Oracle 11 g.

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

Это мой провал оракул хранимой процедуры. Я застрял в синтаксисе 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

Какую версию оракул вы используете? [возможно, это может помочь.] (http://stackoverflow.com/questions/470542/how-do-limit-the-number-of-rows-returned-by-an-oracle-query-after-ordering) –

+1

Первое, что нужно сделать, это удалить кавычки '[..]' '. Это неверно для идентификатора SQL. –

+0

oracle 11g version – oOZz

ответ

1

Вы можете использовать только переменную простого типа в предложении 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; ,

Но предпочтительным способом возврата данных является выходной параметр REF CURSOR, см. http://oracle-base.com/articles/misc/using-ref-cursors-to-return-recordsets.php.

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]; 
+0

Я создаю хранимую процедуру оракула, но я использую dll Ole DB. как я могу использовать Oracle dll? Любой совет ? Tkanks ... – oOZz

+0

По моим сведениям, вы должны просто заменить «OracleCommand» на «OracleDBCommand», «OracleType» на «OracleDBType» и т. Д., посмотреть, что предлагает Intellisense. Не уверен в этом, но это должно работать, просто Google для примеров. –

+0

OracleType.Cursor не поддерживает Ole Db. Возможно, я могу использовать dll доступа к данным оракула. Спасибо за вашу помощь. – oOZz

Смежные вопросы