Не могу вычесть два числа в функции PLSQL - PullRequest
1 голос
/ 18 мая 2011

Следующая функция предназначена для разделения CLOB с разделителями на строковый массив:

FUNCTION SPLIT_CLOB(sText IN clob, sDel IN VARCHAR2 := ',') RETURN CLOB_ARRAY IS
         nStartIdx PLS_INTEGER := 1;
         nEndIdx PLS_INTEGER := 1;
         oRet CLOB_ARRAY := CLOB_ARRAY();
     BEGIN
         IF sText IS NULL THEN RETURN oRet; END IF;
         IF DBMS_LOB.getlength(sText) = 0 THEN RETURN oRet; END IF;

         LOOP

            nEndIdx := DBMS_LOB.INSTR(sText, sDel, nStartIdx);

            IF nEndIdx > 0 THEN
               oRet.Extend;
               /* compiler error on this statement: */
               oRet(oRet.LAST) := DBMS_LOB.SUBSTR(sText, (nEndIdx – nStartIdx), nStartIdx);
               nStartIdx := nEndIdx + LENGTH(sDel);
            ELSE
               oRet.Extend();
               oRet(oRet.LAST) := DBMS_LOB.SUBSTR(lob_loc => sText, offset => nStartIdx);
               EXIT;
            END IF;
         END LOOP;

         RETURN oRet;

     END SPLIT_CLOB;

Линия:

oRet(oRet.LAST) := DBMS_LOB.SUBSTR(sText, (nEndIdx – nStartIdx), nStartIdx);

выдает ошибки компилятора PLS-00103. Но если я поменяю звонок на:

oRet(oRet.LAST) := DBMS_LOB.SUBSTR(sText, 5, nStartIdx);

все хорошо. Я попытался создать другую переменную, чтобы выполнить вычитание заранее, но столкнулся с той же ошибкой PLS-00103.

Я потерял связь? Я забыл, как вычесть два числа или что-то?

Пожалуйста, помогите. Спасибо.

EDIT

Хорошо, странная вещь только что произошла ... в остальной части этого пакета я знаю, что вычитал некоторые PLS_INTEGER где-то еще в другой функции ... поэтому я нашел такой пример, затем скопируйте и вставьте минус знак найден в моей другой функции, и вещь компилируется ...

Спасибо за вашу помощь ...

Ответы [ 2 ]

1 голос
/ 18 мая 2011

"Операции, включающие шаблоны в качестве параметров, такие как COMPARE, INSTR и SUBSTR, не поддерживают регулярные выражения или специальные совпадающие символы (например,% в операторе LIKE в SQL) в параметре шаблона или подстроках."http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_lob.htm

Я думаю, что вы должны вычислить "nEndIdx - nStartIdx" вне функции SUBSTR

Substr Ref.http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_lob.htm#i999349

1 голос
/ 18 мая 2011

Почему бы не сделать расчет до

oRet(oRet.LAST) := DBMS_LOB.SUBSTR(sText, (nEndIdx – nStartIdx), nStartIdx); 

например

calcValue := nEndIdx – nStartIdx;

oRet(oRet.LAST) := DBMS_LOB.SUBSTR(sText, calcValue, nStartIdx); 
...