Я преобразовываю хранимую процедуру sql в oracle, но получаю сообщение об ошибке - PullRequest
0 голосов
/ 06 ноября 2019

Следующая моя хранимая процедура. Это дает мне ошибку:

(PLS-00103 (65: 199): PLS-00103: Обнаружен символ "(" при ожидании одного из следующего:.) @%).

Ошибка в этой строке:

v_SQLrecords := 'select distinct FEEDBACKQUESTIONS.FeedbackQuestionId as id,' || p_cols || ' ' || v_SQL || ' order by ' || p_cols || ' ' || p_order || ' OFFSET ' || CAST(p_rowsPerPage AS nvarchar2(500)) || ' * (' || CAST(p_pageNo AS nvarchar2(500)) || ' - 1) ROWS FETCH NEXT ' || CAST(p_rowsPerPage AS nvarchar2(500)) || ' ROWS ONLY'

Пожалуйста, предложите мне.

CREATE OR REPLACE PROCEDURE GetFeedbackQuestions (
p_LanguageName NCLOB DEFAULT NULL,
p_Crd timestamp DEFAULT NULL,
p_CrdBy number DEFAULT NULL,
p_IsDisabled number DEFAULT NULL, 
p_LanguageId number DEFAULT NULL,
p_Lmd timestamp DEFAULT NULL,
p_LmdBy number DEFAULT NULL,
p_Question  nvarchar2 DEFAULT NULL,
p_SequenceNo number DEFAULT NULL, 
p_RowCount number DEFAULT NULL, 
p_rowsPerPage number DEFAULT 10,
p_pageNo number DEFAULT 1,
p_cols NCLOB DEFAULT 'FeedbackQuestionId',
p_order NCLOB DEFAULT 'desc',cur OUT SYS_REFCURSOR) 
AS
  v_SQL NCLOB := ' from FEEDBACKQUESTIONS left join LANGUAGES on FEEDBACKQUESTIONS.LanguageId = LANGUAGES.LanguageId   where 1=1 ';
          v_ParamDefinition NCLOB;v_SQLrecords NCLOB;
BEGIN

  IF (p_LanguageName IS NOT NULL)
  THEN
    v_SQL := v_SQL || ' and LANGUAGES.LanguageName like  ''%' || p_LanguageName || '%''';
  END IF;
  IF (p_Crd IS NOT NULL)
  THEN
    v_SQL := v_SQL || ' and cast(FEEDBACKQUESTIONS.Crd as date)  = p_Crd';
  END IF;
  IF (p_CrdBy IS NOT NULL)
  THEN
    v_SQL := v_SQL || ' and FEEDBACKQUESTIONS.CrdBy = p_CrdBy';
  END IF;
  IF (p_IsDisabled IS NOT NULL)
  THEN
    v_SQL := v_SQL || ' and FEEDBACKQUESTIONS.IsDisabled = p_IsDisabled';
  END IF;
  IF (p_LanguageId IS NOT NULL)
  THEN
    v_SQL := v_SQL || ' and FEEDBACKQUESTIONS.LanguageId = p_LanguageId';
  END IF;
  IF (p_Lmd IS NOT NULL)
  THEN
    v_SQL := v_SQL || ' and cast(FEEDBACKQUESTIONS.Lmd as date)  = p_Lmd';
  END IF;
  IF (p_LmdBy IS NOT NULL)
  THEN
    v_SQL := v_SQL || ' and FEEDBACKQUESTIONS.LmdBy = p_LmdBy';
  END IF;
  IF (p_Question IS NOT NULL)
  THEN
    v_SQL := v_SQL || ' and FEEDBACKQUESTIONS.Question like  ''%' || p_Question || '%''';
  END IF;
  IF (p_SequenceNo IS NOT NULL)
  THEN
    v_SQL := v_SQL || ' and FEEDBACKQUESTIONS.SequenceNo = p_SequenceNo';
  END IF;
  v_ParamDefinition := 'p_LanguageName NCLOB,p_Crd TIMESTAMP(3) , p_CrdBy NUMBER(19) , p_IsDisabled NUMBER(1) , p_LanguageId NUMBER(19) , p_Lmd TIMESTAMP(3) , p_LmdBy NUMBER(19) , p_Question NCLOB , p_SequenceNo NUMBER(19) ';
  IF (p_cols IS NOT NULL)
  THEN
    p_cols := 'FEEDBACKQUESTIONS.' || p_cols || '';
  END IF;
  **v_SQLrecords := 'select distinct FEEDBACKQUESTIONS.FeedbackQuestionId as id,' || p_cols || ' ' || v_SQL || ' order by ' || p_cols || ' ' || p_order || ' OFFSET ' || CAST(p_rowsPerPage AS nvarchar2(500)) || ' * (' || CAST(p_pageNo AS nvarchar2(500)) || ' - 1) ROWS FETCH NEXT ' || CAST(p_rowsPerPage AS nvarchar2(500)) || ' ROWS ONLY';**
  EXECUTE IMMEDIATE   v_SQLrecords using
                      v_ParamDefinition,
                        p_LanguageName,
                        p_Crd,
                        p_CrdBy,
                        p_IsDisabled,
                        p_LanguageId,
                        p_Lmd,
                        p_LmdBy,
                        p_Question,
                        p_SequenceNo;
  v_ParamDefinition := v_ParamDefinition || ', @RowCountOUT NCLOB OUTPUT';
  v_SQLrecords := 'select @RowCountOUT =count(distinct FEEDBACKQUESTIONS.FeedbackQuestionId) ' || v_SQL;
  EXECUTE IMMEDIATE   v_SQLrecords using
                        v_ParamDefinition,
                        p_LanguageName,
                        p_Crd,
                        p_CrdBy,
                        p_IsDisabled,
                        p_LanguageId,
                        p_Lmd,
                        p_LmdBy,
                        p_Question,
                        p_SequenceNo,
                        RowCountOUT := p_RowCount OUT
  OPEN cur FOR SELECT
    p_RowCount FROM dual;
END;

1 Ответ

0 голосов
/ 06 ноября 2019

Вы должны применить кавычку даже к CAST заявлениям.

CAST(p_rowsPerPage AS nvarchar2(500)) должно быть 'CAST(' || p_rowsPerPage || 'AS nvarchar2(500))'

Таким образом, ваша строка ошибки должна быть

v_SQLrecords := 'select distinct FEEDBACKQUESTIONS.FeedbackQuestionId as id,' 
             || p_cols || ' ' || v_SQL || ' order by ' || p_cols || ' ' || p_order 
             || ' OFFSET ' || 'CAST(' || p_rowsPerPage || 'AS nvarchar2(500))'  || ' * (' || 'CAST(' || p_pageNo || 'AS nvarchar2(500))'
             || ' - 1) ROWS FETCH NEXT ' 
             || 'CAST(' || p_rowsPerPage || 'AS nvarchar2(500))'  || ' ROWS ONLY';

Как уже упоминалось в чате, есть и другие ошибки. Это только для первой строки, как вы просили.

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