Хранимая процедура выдает ошибки при компиляции: Oracle sql разработчик - PullRequest
0 голосов
/ 31 марта 2020

Я работаю с SQL Server уже много лет. Но в моем текущем проекте было требование, чтобы мне пришлось преобразовать процедуру, написанную на SQL Server, в Oracle (в SQL Инструмент разработчика).

Но, похоже, много минут изменения синтаксиса, которые я не могу выяснить с помощью брошенных сообщений об ошибках.

Вот моя хранимая процедура:

CREATE OR REPLACE PROCEDURE PROC_MyPROC
(
  PAGENUMBER IN NUMBER 
, PAGESIZE IN NUMBER 
, SEARCHTERM IN VARCHAR2 
, TOTAL IN NUMBER 
) AS 
BEGIN
  IF(PAGENUMBER=1)  
    THEN
          SELECT COUNT(distinct mastraccnt.T1Column1) INTO TOTAL    
          FROM Table1  mastraccnt  
          JOIN Table2 req on LTRIM(RTRIM(req.T2Column1)) = LTRIM(RTRIM(mastraccnt.T1Column1))
          WHERE LOWER(RTRIM(LTRIM(mastraccnt.T1Column1))||' - '||RTRIM(LTRIM(req.T2Column2))) like 
          '%'||LOWER(SEARCHTERM)||'%';
    END IF;

  SELECT distinct RTRIM(LTRIM(mastraccnt.T1Column1)) as MasterAccountId,
  RTRIM(LTRIM(mastraccnt.T1Column1))||' - '|| RTRIM(LTRIM(req.T2Column2)) as MasterAccountName,
  TOTAL AS TotalRows  
  FROM Table1 mastraccnt 
  JOIN Table2 req on LTRIM(RTRIM(req.T2Column1)) = LTRIM(RTRIM(mastraccnt.T1Column1))  
  WHERE LOWER(RTRIM(LTRIM(mastraccnt.T1Column1))||' - '||RTRIM(LTRIM(req.T2Column2))) like 
  '%'||LOWER(SearchTerm)||'%'   
  ORDER BY MasterAccountName    
  OFFSET PAGESIZE * (PAGENUMBER - 1) ROWS   
  FETCH NEXT PAGESIZE ROWS ONLY; 

END PROC_MyPROC; 

При компиляции я получаю эти ошибки, не знаю, что они означают. Может кто-нибудь помочь мне, что не так с моей процедурой?

enter image description here

1 Ответ

3 голосов
/ 31 марта 2020

Существует несколько проблем с вашим кодом:

  1. Ваша переменная TOTAL является входным параметром и не может быть изменена. Вы пытаетесь изменить его значение, используя INTO TOTAL. что не разрешено в oracle.

  2. Второму оператору SELECT в вашей процедуре требуется условие INTO или он должен быть частью некоторого курсора. Вы не можете написать любой запрос SELECT в процедуре просто так. Что ожидается от этого SELECT запроса?

  3. LTRIM(RTRIM(REQ.T2COLUMN1)) можно заменить значением TRIM(REQ.T2COLUMN1)

  4. OFFSET должно быть stati c integer.

Я думаю, вам нужно что-то вроде этого:

CREATE OR REPLACE PROCEDURE PROC_MYPROC (
    PAGENUMBER   IN           NUMBER,
    PAGESIZE     IN           NUMBER,
    SEARCHTERM   IN           VARCHAR2,
    TOTAL        IN OUT       NUMBER,
    OUT_RESULT   OUT          SYS_REFCURSOR
) AS
BEGIN
    IF PAGENUMBER = 1 THEN
        SELECT
            COUNT(DISTINCT MASTRACCNT.T1COLUMN1)
        INTO TOTAL
        FROM
            TABLE1 MASTRACCNT
            JOIN TABLE2 REQ ON LTRIM(RTRIM(REQ.T2COLUMN1)) = LTRIM(RTRIM(MASTRACCNT.T1COLUMN1))
        WHERE
            LOWER(RTRIM(LTRIM(MASTRACCNT.T1COLUMN1))
                  || ' - '
                  || RTRIM(LTRIM(REQ.T2COLUMN2))) LIKE '%'
                                                       || LOWER(SEARCHTERM)
                                                       || '%';

    END IF;

    OPEN OUT_RESULT FOR SELECT
                           MASTERACCOUNTID,
                           MASTERACCOUNTNAME,
                           TOTALROWS
                       FROM
                           (
                               SELECT
                                   MASTERACCOUNTID,
                                   MASTERACCOUNTNAME,
                                   TOTALROWS,
                                   ROW_NUMBER() OVER(
                                       ORDER BY
                                           MASTERACCOUNTNAME
                                   ) AS RN
                               FROM
                                   (
                                       SELECT DISTINCT
                                           RTRIM(LTRIM(MASTRACCNT.T1COLUMN1)) AS MASTERACCOUNTID,
                                           RTRIM(LTRIM(MASTRACCNT.T1COLUMN1))
                                           || ' - '
                                           || RTRIM(LTRIM(REQ.T2COLUMN2)) AS MASTERACCOUNTNAME,
                                           TOTAL   AS TOTALROWS
                                       FROM
                                           TABLE1 MASTRACCNT
                                           JOIN TABLE2 REQ ON LTRIM(RTRIM(REQ.T2COLUMN1)) = LTRIM(RTRIM(MASTRACCNT.T1COLUMN1))
                                       WHERE
                                           LOWER(RTRIM(LTRIM(MASTRACCNT.T1COLUMN1))
                                                 || ' - '
                                                 || RTRIM(LTRIM(REQ.T2COLUMN2))) LIKE '%'
                                                                                      || LOWER(SEARCHTERM)
                                                                                      || '%'
                                   )
                           )
                       WHERE
                           RN > PAGESIZE * ( PAGENUMBER - 1 )
                           AND RN <= PAGESIZE * ( PAGENUMBER - 1 ) + PAGESIZE
                       ORDER BY
                           MASTERACCOUNTNAME;

END PROC_MYPROC;
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...