0

以下是我的存储过程。它给了我错误:

(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;
4

1 回答 1

0

您甚至必须对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';

正如聊天中提到的,还有其他错误。这只是你问的第一行。

于 2019-11-06T12:38:14.087 回答